目录
1. 什么是密码加密
2. 典型的消息摘要算法
1. 什么是密码加密
用户在使用软件时所提交的密码,不应该被记录下来,如果将用户的密码记录,这是不安全的做法!
当用户提交注册信息时,密码必须被记录下来,为了保障密码安全,必须对用户提交的原始密码进行加密处理!
用户提交的原始密码通常可以称之为“明文密码”,或“密码的原文”,经过编码处理后,得到的结果通常是不能被直接识别的另一个数据,称之为“密文”。
当尝试对密码进行加密处理时,应该使用成熟的、已有的算法!
需要注意:当需要将密码进行加密并存储下来时(例如存储到数据库中),不可以使用“加密算法”!因为所有的“加密算法”都是可以逆向运算的,即根据密文可以逆向运算得到原文,这种算法通常是用于保障传输过程的安全,并不用于保障存储下来的数据的不可逆向运算!
2. 典型的消息摘要算法
对于将要存储下来的密码,一般使用“消息摘要算法”进行处理,这类算法是不可以逆向运算的!
消息摘要算法有以下特点:
- 使用同样的算法,使用同样的消息,运算得到的摘要必然相同
- 使用同样的算法,无论使用什么消息,运算得到的摘要的长度是相同的
- 使用同样的算法,使用不同的消息,运算得到的摘要极大概率不会相同
典型的消息摘要算法有:
- SHA家族(Secure Hash Algorithm)
- SHA-1(160位算法)
- SHA-256(256位算法)
- SHA-384(384位算法)
- SHA-512(512位算法)
- MD系列(Message Digest)
- MD2(128位算法)
- MD4(128位算法)
- MD5(128位算法)
在Spring Boot项目中,依赖项中已经包含了DigestUtils
工具类,此工具类有便利的、使用MD5算法的API:
@Test
void encode() {
String rawPassword = "123456";
String encodedPassword = DigestUtils.md5DigestAsHex(
rawPassword.getBytes());
System.out.println("原文:" + rawPassword);
System.out.println("密文:" + encodedPassword);
}
由于消息摘要算法中“消息”和“摘要”是固定对应的(相同的消息,摘要必然相同),在网络上也有许多平台可以实现消息摘要的“破解”。
这些“破解”平台能够收录的消息与摘要的对应关系是非常有限的,所以,在设计软件时,应该要求用户(软件的使用者)使用安全强度更高的密码!
另外,还应该对密码进行“加盐”处理,即在编码过程中,使用“盐值”。
盐值是一个自行指定值的字符串,应该被用于编码过程,但具体使用方式并没有统一的规定。
使用盐的示例:
@Test
void encode() {
String salt = "3r3HDSLQrAqweHKFwyJfDtt4876oruiSJF4glui"; // 盐值
String rawPassword = "123456";
String encodedPassword = DigestUtils.md5DigestAsHex(
(rawPassword + salt).getBytes());
System.out.println("原文:" + rawPassword);
System.out.println("密文:" + encodedPassword);
}
个人主页:居然天上楼
感谢你这么可爱帅气还这么热爱学习~~
人生海海,山山而川
你的点赞👍 收藏⭐ 留言📝 加关注✅
是对我最大的支持与鞭策