文章目录

  • 前言
  • MD5的八卦
  • BCrypt加密
    • 自己加盐
    • 工作负载
    • 使用方便
  • 总结

前言

最近经常看到一种关于 MD5 的说法,比如某某系统的登录模块使用了 MD5 加密算法,保证了用户密码的安全。那么 MD5 究竟是不是一种加密算法呢?从概念上来说『加密』对应的是『解密』,我们把数据采用某种方式加密之后,可以在之后的某一时刻进行解密来获得原始数据,照此观点来说 MD5 并不是一种加密算法,它只能把原文加密成密文,而不能将密文解密成原文。但是 MD5 确实把明文变成了不容易被破解的密文,达到了 “加密” 的目的,好像说它可以用来加密勉强也可以。

更准确的说法,MD5 是一种哈希算法,又叫散列算法或者摘要算法,是一类把任意长度数据转换为定长数据的算法统称,它广泛应用于错误检查,经常通过计算 MD5 来检验下载到的文件的完整性,优秀的哈希算法通常需要具有低碰撞概率,MD5 就是其中的一种。

MD5的八卦

可用于处理密码,是不可逆的

刚刚前面已经提到它可以把原始数据变成定长的摘要信息,而不能把摘要信息再还原成原始数据。就比如 110+119=229,通过原始信息 110 和 119 可以转化成摘要信息229,而已知229却无法知道它是由那两个数相加得到的,当然这个例子只是象征性的,它的碰撞率太高了。

既然不可逆,那么怎样才能判断密码信息呢?这可以利用比较hash值来判断,我们在注册时计算密码的 MD5 值入库,当玩家登录时再次使用玩家输入的明文密码再次计算 MD5 值,如果一致就验证成功,这就是为什么哈希算法要有低碰撞率了。

MD5现在不太安全了

因为MD5算法是确定,用一个字符串计算出来的哈希值也是固定的,所以出现了一些针对该算法的破解方法。

  1. 暴力枚举法:因为可以不断尝试,并且随着计算机硬件能力的快速提升,使得这种方法来破解短密码称为了可能
  2. 字典法:也就是撞库,黑客通过收集互联网已泄露的用户和密码信息,生成对应的字典表,通过撞库来完成破解
  3. 彩虹表:在字典法的基础上改进,以时间换空间,使用预计算的哈希链集来降低存储空间,是目前最常用的方法

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又是什么呢相关推荐

  1. shiro认证+授权(使用MD5+salt+散列加密)

    通过上文自定义realm分析源码可得https://blog.csdn.net/Kevinnsm/article/details/11183124 用户认证在doGetAuthenticationIn ...

  2. C#中使用MD5对用户密码加密与解密

    C#中常涉及到对用户密码的加密于解密的算法,其中使用MD5加密是最常见的的实现方式.本文总结了通用的算法并结合了自己的一点小经验,分享给大家. 一.使用16位.32位.64位MD5方法对用户名加密 1 ...

  3. 使用MD5对用户密码加密与解密

    MD5简介 : MD5的全称是Message-Digest Algorithm 5,在90年代初由MIT的计算机科学实验室和RSA Data Security Inc发明,经MD2.MD3和MD4发展 ...

  4. Jva编解码,加密工具类大全(Base64编解码,URL 编解码,sha56_Hmac加密,MD5对字符串进行加密,java自带类实现SHA-256方式加密)

    Base64编解码 /*** Base64编码.*/public static String encodeBase64(byte[] input) {return new String(Base64. ...

  5. 新版百度网盘MD5 获取计算提取加密映射 方式

    新版百度网盘MD5 获取计算提取加密映射 方式: 对本地文件的md5做如下计算,即可对上后端返回的md5数据 public static String encMd5(String md5) {Stri ...

  6. 项目中的MD5、盐值加密

    首先介绍一下MD5,而项目中用的是MD5和盐值来确保密码的安全性: 1. md5简介 md5的全称是md5信息摘要算法(英文:MD5 Message-Digest Algorithm ),一种被广泛使 ...

  7. ASP.NET中使用MD5和SHA1算法加密

    你的主页或者你管理的网站有各种密码需要保护,把密码直接放在数据库或者文件中存在不少安全隐患,所以密码加密后存储是最常见的做法.在ASP.NET中实现加密非常容易..NET SDK中提供了CookieA ...

  8. AS2的MD5/SHA1/TEA等加密算法类

    meychi写的AS2的加密算法类.   打包下载,另存为rar文件,没办法,只能这样. 1.MD5:静态类   /** * MD5 Class v1.0 * Author  : Mika Palmu ...

  9. MD5之C#密码加密-备忘录

    MD5算法说明:  加密算法都是对字节数组或流进行加密的.MD5的算法则是对原始的字节数组随机(有算法的随机)抽取几个字节,经过运算后返回新的字节(加密以后的字节).它不 仅可以对字符串进行加密,也可 ...

最新文章

  1. 文远知行A轮再获数千万美元融资 商汤科技和农银国际跟投
  2. linux中256错误,YUM安装遭遇: [Errno 256] No more mirrors to try
  3. appium自动化测试_Appium自动化测试入门教程No.1—— Appium介绍
  4. 使用 jQuery Mobile 与 HTML5 开发 Web App (七) —— jQuery Mobile 列表
  5. 2015计算机考研重点,2015考研计算机复习:数据结构重点归纳_跨考网
  6. 【curl】【php】curl报错,错误代码77,CURLE_SSL_CACERT_BADFILE (77)解决方法
  7. 仿各大app的商品详情页购买信息弹幕
  8. 猫扑_猫女郎图片批量下载器
  9. 2012美国大选献金项目数据分析(有史以来最全面)
  10. 接口返回的是一个图片文件而不是url 前端如何显示?
  11. 沈阳农业大学计算机专业排名,沈阳农业大学王牌专业排名
  12. QFramework引入Utility和System
  13. HALCON灰度值变换
  14. 云虚拟主机worldpress安装教程
  15. 1分钟学会网站采集方法详解
  16. C++中的字符串的定义方式
  17. 一级计算机考试计算,全国计算机一级MS OFFICE等级考试计算题(3)
  18. matlab里正负号怎么表示,正负号符号上下一起怎么输入?
  19. Oracle PL/SQL实战
  20. Codeforces1562 C. Rings(构造)

热门文章

  1. 7-1 城市间紧急救援
  2. 高低电平报警器的设计
  3. python脚本备份linux,linux利用bypy自动备份文件上传百度云
  4. 主流计算虚拟化技术/华为的产品介绍
  5. git合并丢失代码问题分析与解决
  6. 发展认知科学EEG研究: 新视角与挑战
  7. PLC是如何控制伺服电机的?
  8. Java、JFrame制作录制GIF小工具
  9. Linux系统中rpm命令用法详解
  10. 人工智能在药物研发和生物技术中的应用:回顾与展望