前言

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


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. 2022-2028年中国社区体育产业深度调研及投资前景预测报告
  2. 旷视提Circle Loss,统一优化视角,革新深度特征学习范式 | CVPR 2020
  3. Bitmap基本概念及在Android4.4系统上使用BitmapFactory的注意事项
  4. Java运行时动态加载类之ClassLoader方法带参数
  5. 判断用户是否存在再进行新增_MySQL用户行为分析
  6. 2006年4月计算机等级考试二级Java笔试答案
  7. (数据科学学习手札30)朴素贝叶斯分类器的原理详解Python与R实现
  8. usaco-sprime-superprime-pass
  9. java和网易我的世界有什么区别_网易我的世界手机版对比正版JAVA版我的世界有什么区别?...
  10. 稳压电源的设计与制作_电子爱好设计的直流可调压电源电路,太完美了,有图,亲测可用...
  11. vuex 在非组件中调用 mutations 方法
  12. python 怎么取对数_重新开始学习Python 第二十八天 Python 数学模块
  13. 666. 三角形类型
  14. java-php-python-ssm企业员工考勤系统的设计与实现计算机毕业设计
  15. linux定时任务_linux定时任务
  16. 生鲜电商有哪些盈利模式?
  17. seagull基本概念
  18. 【Python 日志】
  19. html修改li大小,css为li设置不同宽度
  20. 华南师范大学计算机学院图论,葛文秀 - 华南师范大学 - 数学科学学院

热门文章

  1. 农场小游戏开发你一定要知道的事
  2. 空调大一匹和1.5匹的区别
  3. CCS5.5如何配置simulator模拟器调试
  4. 微软Office与金山WPS Office有何私密关系?
  5. 5s信号无服务器,iPhone5S A1528摔后无服务维修过程
  6. 网络语言不c,盘点2018年十大网络用语,佛系、官宣、C位、扛精你都知道吗?
  7. 微信全面封杀三款社交 App,罗永浩:历史会记住这一天...
  8. 谷歌AI“你画我猜”强推“狗年版本”,腾讯AI要帮你修老照片 | 竹货新春
  9. 从Etherscan在2021年的功能更新,看加密世界的发展历程和方向
  10. 数据驱动从方法到实践pdf_我从数据驱动设计方法中学到的东西