前言

为了保障用户的敏感数据安全,通常都会对其进行加密,然后将加密后的数据存入数据库中,例如用户密码,在用户进行登录的时候,将其输入的密码与数据库中存放的密文进行比较,以验证用户密码是否正确。


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相关推荐

  1. 加密算法 AES MD5 SHA1

    2019独角兽企业重金招聘Python工程师标准>>> 加密算法通常分为对称性加密算法和非对称性加密算法,对于对称性加密算法,信息接收双方都需事先知道密匙和加解密算法且其密匙是相同的 ...

  2. MD5,SHA-1,SHA-256摘要加解密

    2019独角兽企业重金招聘Python工程师标准>>> /*** 对字符串加密,加密算法使用MD5,SHA-1,SHA-256,默认使用SHA-256** @param strSrc ...

  3. 加密算法(DES,AES,RSA,ECC,MD5,SHA1)简介

    加密算法(DES,AES,RSA,MD5,SHA1)简介 一.对称性加密算法 二.非对称算法 三.散列算法 四.算法举例 1.对称性加密算法有:AES.DES.3DES 1.1.DES(Data En ...

  4. 常用的加密算法(md5,sha1,base64加密解密)使用

    import org.apache.commons.codec.digest.DigestUtils; import java.util.Base64; import java.util.Scanne ...

  5. MD5 SHA1 哈希 签名 碰撞 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  6. Hash校验工具、MD5 SHA1 SHA256命令行工具

    MyHash 检验工具http://www.zdfans.com/html/4346.html HashMyFiles Hash校验工具http://www.nirsoft.net/utils/has ...

  7. MD5 SHA1 SHA256 SHA512 SHA1WithRSA RSA 的区别

    转自:http://www.cnblogs.com/cxygg/p/9468653.html https://blog.csdn.net/hengshujiyi/article/details/459 ...

  8. MD5 SHA1 HMAC HMAC_SHA1区别(转载网上大牛)个人备忘和加注了

    MD5 SHA1 HMAC HMAC_SHA1区别 什么是MD5,什么是SHA1,如何校验这些Hash.还有拿单个apk文件的MD5,SHA1讯问是不是原版的问题,在这里,让我们先来了解一些基本知识, ...

  9. Java数据加密(MD5,sha1,sha256)

    数据加密,是一门历史悠久的技术,指通过 加密算法和加密 密钥将明文转变为密文,而解密则是通过解密算法和解密密钥将密文恢复为明文.它的核心是密码学.数据加密目前仍是 计算机系统对信息进行保护的一种最可靠 ...

最新文章

  1. Redhat 7使用CentOS 7的Yum网络源
  2. python画三维温度散点图-python 绘制三维图形、三维数据散点图
  3. hdu4849 最短路
  4. spark task和stage划分原理
  5. ai背景合成_AI设计制作万圣节夜景插画
  6. WCF服务自托管(Self-Hosting)
  7. 在linux中查找运行程序句柄,如何查找我的进程在Linux中打开的文件句柄?
  8. 【转】全了!临港四镇最新对口地段小学,中学都在这里,看看你的孩子能读哪个学校
  9. java双击添加文本框_java图形界面 怎么文本框要用鼠标点一下才出来
  10. BUPT复试专题—C翻转(2010)
  11. java 记住密码的实现,JAVA记住密码功能的实现代码
  12. 真假Kingston U盘识别
  13. 网络投票专家投票计算_安全专家说在线投票是一个坏主意。 这就是为什么。
  14. 提问的力量(一):提问在学习中的价值
  15. 【day22】java导出word文档(包含导出图片)
  16. idea使用中项目出现library root
  17. 报错:Module parse failed: ‘return‘ outside of function (4:1) You may need an appropriate loader
  18. 高数 | 【概念剖析】一元、二元微分,连续、可微、可偏导、偏导连续的超强通俗解析!
  19. H265/HEVC编解码系列(1):图像分割(Slice、Tile、CTU)
  20. 智慧民政解决方案-最新全套文件

热门文章

  1. ZJOI2006书架Treap做法
  2. 页面崩溃了!记录一次测试中出现的前端内存溢出现象
  3. 计算机CPU哪家好,电脑处理器排行榜,教您电脑处理器哪个好
  4. 2019年女王传奇胡荧魅惑性学堂开课现场
  5. 域名增加https访问
  6. ios查找我的手机关闭位置服务器,iPhone维修为什么要关闭查找我的iPhone功能啊?...
  7. 用户注册场景-手机短信验证解决
  8. python实现桌面自动化画图
  9. 瑞芯微sensors中断linux实现方式
  10. 数据分析6 面试题汇总