最近在学习关于加密算法的知识,经过一天学习也算是有了一点浅浅的收获,随手记一下。
一、加密算法有哪些?
首先,在开始了解加密算法之前只想知道Bcrypt算法是如何加密的,但随着后面不断的搜索,就慢慢冒出了一大堆的加密算法,看的我是眼花缭乱。
接下来就来说说有哪些加密算法。
-
MD5: 为计算机安全领域广泛使用的一种散列函数,用以提供消息完整性的保护,是一种消息摘要算法,它是 不可逆 的 单向 加密算法。
-
RSA:是一种 可逆的非对称 加密算法。是目前最有影响的公钥加密算法,并被普遍认为是目前最优秀的公钥方案之一。
-
Bcrypt:是一种 不可逆的单向 加密算法。相比于MD5,它的加密过程更久,因此也比MD5更安全,通过暴力的破解方式需要很长时间,不易破解。
以上就是主要了解的三种加密算法,这篇文章先对Bcryt算法进行较为详细的说明。
通过上述的定义,可以看到很多(不)可逆、单/双向、(非)对称这类的名词
其实这就是对加密算法的一种分类
单向加密:即我们可以将密码加密成一个密文,这个密文不同于明文,是不会一眼就能看出密码是多少。但是我们不能根据密文推回明文,即就算数据库被人黑了,有了用户密码的密文,也无法根据密文知道用户密码是多少。
双向加密:即比单向加密多了根据密文推出明文,同时又分为 对称 / 非对称加密算法。
对称加密 :即加密后会生成一个密钥,通过这个密钥完成解密和加密过程
非对称加密:非对称加密算法需要两个密钥:公开密钥(publickey:简称公钥)和 私有密钥(privatekey:简称私钥)。 公钥 与 私钥 是一对,如果用公钥对数据进行加密,只有用对应的私钥才能解密。因为加密和解密 使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。
对称加密如下图:
二、Bcrypt与Hash算法
通过对比学习才能让人印象深刻~
Bcrypt生成的密文是60位的,MD5的是32位的。
哈希算法
-
哈希算法往往被设计成生成具有相同长度的文本,而加密算法生成的文本长度与明文本身的长度有关。
-
哈希算法是不可逆的,就是不能根据生成的字符串反推到明文。
-
HASH 算法是一种消息摘要算法,不是一种加密算法,但由于其单向运算,具有一定的不可逆性,成为加密算法中的一个构成部分。
在上面我们说 Bcrypt 是不可逆的单向加密算法,那么又和hash算法的结果有什么区别呢?
自己写的加密算法或者MD5,同一个密码生成的Hash值是一样的,而BCrypt算法每次加密生成的Hash值是不同的。这就是 Bcrypt 的优势,每次生成的hash值都不一样意味着 Bcrypt的安全系数更高。
那么是怎么做到每次都能产生不一样的hash值呢?
是因为Bcrypt算法它每次加密的时候,会随机加盐,而不是固定一种加盐方式。加密算法重点考虑的就是怎么才能确保密文不被轻易破解。而黑客破解常用的几种有:暴力枚举法、字典法、彩虹表法。因为固定的hash算法计算得出的hash是一样的,但是一旦加 salt 和 password 一起取 hash 值,最后得到的密文就是不同的。如果只有一种加 salt 的方式,那就提高其破译的难度,而Bcrypt 每次都会随机 加 salt, 这无疑是让破译的难度更大。
Bcrypt的用法流程
-
先随机生成salt,再使salt和password进行hash,将生成的密文存入数据库
-
校验时,将数据库中的密文取出,再从密文中取出salt和 用户输入的密码 进行hash,得到的hash值和数据库中的进行对比,若相同则密码正确。
BCrypt.checkpw(password, user.getPassword() // 根据此函数来检验密码是否正确
BCrypt算法是目前使用比较广泛的加密解密算法,SpringSecurity中提供了BCryptPasswordEncoder类。
导入依赖:
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
</dependency>
测试:
public class BcryptTest {
public static void main(String[] args) {
//用户密码
String password = "123456";
//密码加密
BCryptPasswordEncoder passwordEncoder=new BCryptPasswordEncoder();
//加密
String newPassword = passwordEncoder.encode(password);
System.out.println("加密密码为:"+newPassword);
//对比这两个密码是否是同一个密码
boolean matches = passwordEncoder.matches(password, newPassword);
System.out.println("两个密码一致:"+matches);
}
}
参考资料:
常用的加密算法:单向加密和双向加密_技术交流_牛客网
百度百科-验证
BCrypt 密码加密和解密 - 简书
BCrypt算法加密解密_Romona_J的博客-CSDN博客_bcrypt解密
算法高级(22)-BCrypt加密算法,号称目前最安全的算法之一_十步杀一人_千里不留行的博客-CSDN博客_已知安全的加密算法
MD5算法如何被破解_HelloWorld搬运工的博客-CSDN博客_md5差分攻击文章来源:https://www.toymoban.com/news/detail-743590.html
常用的加密算法 - 简书文章来源地址https://www.toymoban.com/news/detail-743590.html
到了这里,关于论单向加密算法Bcrypt的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!