建议使用 Bcrypt加密算法 代替 MD5/SHA1
前言
为了保障用户的敏感数据安全,通常都会对其进行加密,然后将加密后的数据存入数据库中,例如用户密码,在用户进行登录的时候,将其输入的密码与数据库中存放的密文进行比较,以验证用户密码是否正确。
BCrypt加密: BCrypt是一种跨平台的文件加密工具。 一种加盐的单向Hash,可以简单理解为它内部自己实现了随机加盐处理,不可逆的加密算法,同一种明文(plaintext),每次加密后的密文都不一样,而且不可反向破解生成明文,破解难度很大,BCrypt生成的密文是60位。
MD5加密: 是不加盐的单向Hash,不可逆的加密算法,同一个密码经过hash的时候生成的是同一个hash值,这样就方便了MD5通过大量数据对比的方式进行破解,MD5生成的密文是32位。
SHA1加密: SHA-1可以生成一个被称为消息摘要的160位(20字节)散列值,散列值通常的呈现形式为40个十六进制数,同MD5类似都是hash function,但现阶段也不安全。
如果数据库被“拖库”(指从数据库中导出数据)明文存储的密码就变得不安全。之前的做法是使用 md5 散列的方式,因为 md5 不可逆,无法从密文推出原文。
但是 HASH 算法最大的问题是,会发生撞库,也就是说,有可能出现多个原文得到同一个密码。
下面这个式子是存在的,如果原文是 M1,只需要另外一个同样 HASH 值的密码即可登录。
MD5(M1) = MD5(M2) = MD5(M3)
一种攻击方法是,攻击者记录了一张巨大的密码库,预先计算了常用密码的 hash 值,这样只需要搜索 hash 值就能寻找到一个合适的密码用于登录 —— 也称为被彩虹表攻击。
解决彩虹表的问题是加盐,在加密之前,对原文混入其他信息,混入的信息不存放到数据库中。实际寻找到其他原文也无法登录。
第二中攻击方法是王小云教授寻找到的一种新的方法,通过算法快速的找到 M2,这样不依赖彩虹表就可以实施攻击。
MD5(M1) = MD5(M2)
当被攻击者价值非常大,攻击者获取足够多的撞库原文,还是能分析盐值。
BCrypt
Bcrypt 有两个特点
- 每一次 HASH 出来的值不一样
- 计算非常缓慢
因此使用 Bcrypt 进行加密后,攻击者想要使用算出 M2 成本变得不可接受。但代价是应用自身也会性能受到影响,不过登录行为并不是随时在发生,因此能够忍受。对于攻击者来说,需要不断计算,让攻击变得不太可能。
因此推荐使用 BCrypt 进行密码加密。
在 Java 中使用 Bcrypt
如果引入了 Spring Security, BCryptPasswordEncoder 提供了相关的方法。
public String encode(CharSequence rawPassword) {String salt;if (this.strength > 0) {if (this.random != null) {salt = BCrypt.gensalt(this.strength, this.random);} else {salt = BCrypt.gensalt(this.strength);}} else {salt = BCrypt.gensalt();}return BCrypt.hashpw(rawPassword.toString(), salt);}
- BCryptPasswordEncoder 调用了另外一个类 BCrypt 完成加密操作,实际工作工作中可以直接使用 BCryptPasswordEncoder 类即可。
建议使用 Bcrypt加密算法 代替 MD5/SHA1相关推荐
- 加密算法 AES MD5 SHA1
2019独角兽企业重金招聘Python工程师标准>>> 加密算法通常分为对称性加密算法和非对称性加密算法,对于对称性加密算法,信息接收双方都需事先知道密匙和加解密算法且其密匙是相同的 ...
- MD5,SHA-1,SHA-256摘要加解密
2019独角兽企业重金招聘Python工程师标准>>> /*** 对字符串加密,加密算法使用MD5,SHA-1,SHA-256,默认使用SHA-256** @param strSrc ...
- 加密算法(DES,AES,RSA,ECC,MD5,SHA1)简介
加密算法(DES,AES,RSA,MD5,SHA1)简介 一.对称性加密算法 二.非对称算法 三.散列算法 四.算法举例 1.对称性加密算法有:AES.DES.3DES 1.1.DES(Data En ...
- 常用的加密算法(md5,sha1,base64加密解密)使用
import org.apache.commons.codec.digest.DigestUtils; import java.util.Base64; import java.util.Scanne ...
- MD5 SHA1 哈希 签名 碰撞 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- Hash校验工具、MD5 SHA1 SHA256命令行工具
MyHash 检验工具http://www.zdfans.com/html/4346.html HashMyFiles Hash校验工具http://www.nirsoft.net/utils/has ...
- MD5 SHA1 SHA256 SHA512 SHA1WithRSA RSA 的区别
转自:http://www.cnblogs.com/cxygg/p/9468653.html https://blog.csdn.net/hengshujiyi/article/details/459 ...
- MD5 SHA1 HMAC HMAC_SHA1区别(转载网上大牛)个人备忘和加注了
MD5 SHA1 HMAC HMAC_SHA1区别 什么是MD5,什么是SHA1,如何校验这些Hash.还有拿单个apk文件的MD5,SHA1讯问是不是原版的问题,在这里,让我们先来了解一些基本知识, ...
- Java数据加密(MD5,sha1,sha256)
数据加密,是一门历史悠久的技术,指通过 加密算法和加密 密钥将明文转变为密文,而解密则是通过解密算法和解密密钥将密文恢复为明文.它的核心是密码学.数据加密目前仍是 计算机系统对信息进行保护的一种最可靠 ...
最新文章
- Redhat 7使用CentOS 7的Yum网络源
- python画三维温度散点图-python 绘制三维图形、三维数据散点图
- hdu4849 最短路
- spark task和stage划分原理
- ai背景合成_AI设计制作万圣节夜景插画
- WCF服务自托管(Self-Hosting)
- 在linux中查找运行程序句柄,如何查找我的进程在Linux中打开的文件句柄?
- 【转】全了!临港四镇最新对口地段小学,中学都在这里,看看你的孩子能读哪个学校
- java双击添加文本框_java图形界面 怎么文本框要用鼠标点一下才出来
- BUPT复试专题—C翻转(2010)
- java 记住密码的实现,JAVA记住密码功能的实现代码
- 真假Kingston U盘识别
- 网络投票专家投票计算_安全专家说在线投票是一个坏主意。 这就是为什么。
- 提问的力量(一):提问在学习中的价值
- 【day22】java导出word文档(包含导出图片)
- idea使用中项目出现library root
- 报错:Module parse failed: ‘return‘ outside of function (4:1) You may need an appropriate loader
- 高数 | 【概念剖析】一元、二元微分,连续、可微、可偏导、偏导连续的超强通俗解析!
- H265/HEVC编解码系列(1):图像分割(Slice、Tile、CTU)
- 智慧民政解决方案-最新全套文件