MD5是用来加密的吗?BCrypt又是什么呢
文章目录
- 前言
- MD5的八卦
- BCrypt加密
- 自己加盐
- 工作负载
- 使用方便
- 总结
前言
最近经常看到一种关于 MD5
的说法,比如某某系统的登录模块使用了 MD5
加密算法,保证了用户密码的安全。那么 MD5
究竟是不是一种加密算法呢?从概念上来说『加密』对应的是『解密』,我们把数据采用某种方式加密之后,可以在之后的某一时刻进行解密来获得原始数据,照此观点来说 MD5
并不是一种加密算法,它只能把原文加密成密文,而不能将密文解密成原文。但是 MD5
确实把明文变成了不容易被破解的密文,达到了 “加密” 的目的,好像说它可以用来加密勉强也可以。
更准确的说法,MD5
是一种哈希算法,又叫散列算法或者摘要算法,是一类把任意长度数据转换为定长数据的算法统称,它广泛应用于错误检查,经常通过计算 MD5
来检验下载到的文件的完整性,优秀的哈希算法通常需要具有低碰撞概率,MD5
就是其中的一种。
MD5的八卦
可用于处理密码,是不可逆的
刚刚前面已经提到它可以把原始数据变成定长的摘要信息,而不能把摘要信息再还原成原始数据。就比如 110+119=229
,通过原始信息 110 和 119 可以转化成摘要信息229,而已知229却无法知道它是由那两个数相加得到的,当然这个例子只是象征性的,它的碰撞率太高了。
既然不可逆,那么怎样才能判断密码信息呢?这可以利用比较hash值来判断,我们在注册时计算密码的 MD5
值入库,当玩家登录时再次使用玩家输入的明文密码再次计算 MD5 值,如果一致就验证成功,这就是为什么哈希算法要有低碰撞率了。
MD5现在不太安全了
因为MD5算法是确定,用一个字符串计算出来的哈希值也是固定的,所以出现了一些针对该算法的破解方法。
- 暴力枚举法:因为可以不断尝试,并且随着计算机硬件能力的快速提升,使得这种方法来破解短密码称为了可能
- 字典法:也就是撞库,黑客通过收集互联网已泄露的用户和密码信息,生成对应的字典表,通过撞库来完成破解
- 彩虹表:在字典法的基础上改进,以时间换空间,使用预计算的哈希链集来降低存储空间,是目前最常用的方法
MD5可以为自己代言(带盐)
对于固定的哈希算法,相同的输入会得到相同的输出,那么针对MD5算法只需要准备一个字典或者一个彩虹表就可以一直沿用,如果在原有的密码上加点料,那么即使两个用户使用相同的密码,因为盐不同,得到的输出值也就不同,那么破解难度大大提高了。
BCrypt加密
上面说过单独使用MD5加密不太安全,但是加盐以后可以大大提高破解的难度,为什么BCrypt加密火了起来,大有代替MD5的趋势~
BCrypt 是 Niels Provos 和 DavidMazières 基于 Blowfish 密码设计的,是 OpenBSD 的默认密码哈希算法。 目前有针对 C、C++、Python 、C# 、Java、JS、PHP 等多种编程语言的实现,使用起来非常方便。
它相对于MD5有哪些优势呢?
自己加盐
首先他不用自己来管理用户的“盐”,如果所有的用户使用相同的盐不太安全,每个人生成不同的盐,需要自己单独来存储使用,而BCrypt内部自己实现了随机加盐处理,可以实现每次加密后的密文是不一样的。
对于同一个密码,Bcrypt每次生成的哈希结果都不一样,那么它是如何进行校验的?
其实BCrypt算法将盐随机生成并混入最终加密后的密码之中,验证时会自动提取,无需单独提供“盐”信息,生成的Hash值通常格式如下:
$2b$12$ABJPtagiuqTVhnIPvOLoB.hbIlZ3joRkpck3joDsX6xe3O2KShuty
其中 $
为分隔符,2b
是bcrypt加密版本号,12
是工作负载,紧接着22位是盐,剩下的字符串就是密码的密文了。
看到这个密码仿佛就是明牌了跟对手打呀,如果你真的获得了加密后的密码,那你就知道了加密版本、工作负载,盐的信息,这样会不会很危险呢?是挺危险的,但是即使你使用MD5加密,那个盐也是要存储的,也会面临同样的问题,另外BCrypt还有其他的法宝。
工作负载
BCrypt的工作负载有时也称为加密轮数、成本因子等等(一提到工作负载就想到比特币,数字游戏而已),目的就是提高破解难度,带来的缺点就是速度慢。MD5的Hash值生成通常是微妙级别的,但是Bcrypt一个密码出来的时间比较长,Python环境使用默认12轮负载需要0.25秒生成一个密码(C++环境需要进一步测试)。
所以如果使用Bcrypt,需要考虑它的成本,负责做认证的服务器,可能在原基础上扩容几十倍或者几百倍,它是靠把计算成本提高多个数量级来换取安全的。
使用方便
目前在各大主流编程语言中都可以方便的使用BCrypt相关函数,下面以Python为例:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-import time
import bcryptpasswd = b'123456nx'start = time.time()
salt = bcrypt.gensalt(12)
pwsd = bcrypt.hashpw(passwd, salt)cost = time.time() - start
print("[salt]", salt)
print("[pwsd]", pwsd)
print("[cost]", cost)
运行结果如下:
[salt] b'$2b$12$lEsQ9dGnRe2vKfFDRUZYAO'
[pwsd] b'$2b$12$lEsQ9dGnRe2vKfFDRUZYAOmmmdlgWfHfNO94C/UqCKGGRioruF77u'
[cost] 0.24636435508728027
总结
MD5
从严格意义上来说并不是一个加密算法,更准确的说法应该是单向散列算法,因为无法逆向进行解密- 通过
MD5
计算后的密码,可以使用的破解方法有暴力枚举、字典表、彩虹表等,其中《彩虹表》最常用 BCrypt
算法可以随机生成盐,并将盐信息混入最终加密后的密码之中,验证时会自动提取BCrypt
算法引入了工作负载机制,生成Hash值的时间大大延长,相应的破解难度也随之增加BCrypt
算法在Python环境下使用默认参数需0.25秒生成一个密码,选用这种方式需考虑时间成本
==>> 反爬链接,请勿点击,原地爆炸,概不负责!<<==
以史为鉴,理解今天,展望未来~
时刻准备着,这次的大团圆无需担心,可能某个清晨的早间新闻,你们已经回来了!
MD5是用来加密的吗?BCrypt又是什么呢相关推荐
- shiro认证+授权(使用MD5+salt+散列加密)
通过上文自定义realm分析源码可得https://blog.csdn.net/Kevinnsm/article/details/11183124 用户认证在doGetAuthenticationIn ...
- C#中使用MD5对用户密码加密与解密
C#中常涉及到对用户密码的加密于解密的算法,其中使用MD5加密是最常见的的实现方式.本文总结了通用的算法并结合了自己的一点小经验,分享给大家. 一.使用16位.32位.64位MD5方法对用户名加密 1 ...
- 使用MD5对用户密码加密与解密
MD5简介 : MD5的全称是Message-Digest Algorithm 5,在90年代初由MIT的计算机科学实验室和RSA Data Security Inc发明,经MD2.MD3和MD4发展 ...
- Jva编解码,加密工具类大全(Base64编解码,URL 编解码,sha56_Hmac加密,MD5对字符串进行加密,java自带类实现SHA-256方式加密)
Base64编解码 /*** Base64编码.*/public static String encodeBase64(byte[] input) {return new String(Base64. ...
- 新版百度网盘MD5 获取计算提取加密映射 方式
新版百度网盘MD5 获取计算提取加密映射 方式: 对本地文件的md5做如下计算,即可对上后端返回的md5数据 public static String encMd5(String md5) {Stri ...
- 项目中的MD5、盐值加密
首先介绍一下MD5,而项目中用的是MD5和盐值来确保密码的安全性: 1. md5简介 md5的全称是md5信息摘要算法(英文:MD5 Message-Digest Algorithm ),一种被广泛使 ...
- ASP.NET中使用MD5和SHA1算法加密
你的主页或者你管理的网站有各种密码需要保护,把密码直接放在数据库或者文件中存在不少安全隐患,所以密码加密后存储是最常见的做法.在ASP.NET中实现加密非常容易..NET SDK中提供了CookieA ...
- AS2的MD5/SHA1/TEA等加密算法类
meychi写的AS2的加密算法类. 打包下载,另存为rar文件,没办法,只能这样. 1.MD5:静态类 /** * MD5 Class v1.0 * Author : Mika Palmu ...
- MD5之C#密码加密-备忘录
MD5算法说明: 加密算法都是对字节数组或流进行加密的.MD5的算法则是对原始的字节数组随机(有算法的随机)抽取几个字节,经过运算后返回新的字节(加密以后的字节).它不 仅可以对字符串进行加密,也可 ...
最新文章
- 文远知行A轮再获数千万美元融资 商汤科技和农银国际跟投
- linux中256错误,YUM安装遭遇: [Errno 256] No more mirrors to try
- appium自动化测试_Appium自动化测试入门教程No.1—— Appium介绍
- 使用 jQuery Mobile 与 HTML5 开发 Web App (七) —— jQuery Mobile 列表
- 2015计算机考研重点,2015考研计算机复习:数据结构重点归纳_跨考网
- 【curl】【php】curl报错,错误代码77,CURLE_SSL_CACERT_BADFILE (77)解决方法
- 仿各大app的商品详情页购买信息弹幕
- 猫扑_猫女郎图片批量下载器
- 2012美国大选献金项目数据分析(有史以来最全面)
- 接口返回的是一个图片文件而不是url 前端如何显示?
- 沈阳农业大学计算机专业排名,沈阳农业大学王牌专业排名
- QFramework引入Utility和System
- HALCON灰度值变换
- 云虚拟主机worldpress安装教程
- 1分钟学会网站采集方法详解
- C++中的字符串的定义方式
- 一级计算机考试计算,全国计算机一级MS OFFICE等级考试计算题(3)
- matlab里正负号怎么表示,正负号符号上下一起怎么输入?
- Oracle PL/SQL实战
- Codeforces1562 C. Rings(构造)