目录
消息摘要算法的使用场景:
消息摘要算法的典型特征:
-消息相同,则摘要相同
-无论消息长度为多少,摘要的长度是固定的(同一种算法)
-消息不同,则摘要几乎不会相同
常见的摘要算法有:
-MD系列: MD2(128bit),MD4(128bits),MD5(128bit)
-SHA家族:SHA-1(160bit),SHA-256(256bit),SHA-384(bit),SHA-512(512bit)
1bit,即为1位2进制,其可能结果为-0,1(2种结果,即为2的1一次方)
2bit,即为2位2进制,其可能结果位-00,01,10,11(4种结果,即为2的二次方)
3bit,即为3位2进制,其可能结果位-000,001,010,011,100,101,110,111(8种结果,即为2的三次方)
...
以MD5为例,其运算结果是由128个二进制组成的,所以MD5算法的运算结果的种类有2的128次方种,通常会转换成16进制数来表示,则是32位长度的16进制数
算法不可逆的原理
由于消息算法在运算过程种会丢失一部分数据,所以,消息算法都是不可逆的,即不能通过密文来破解明文
如何保障密码安全
为什么会出现安全问题?
在网络上,有一些平台记录了简单的明文密文的对应关系的数据库,以实现"根据密文查询出原文"的效果,但是前面我们说到了以MD5为例,能产生的运算结果种类有2的128次方种,所以,这些平台不能穷举所有的对应关系,只能记录很小一部分(简单明文),因此,只要原文足够复杂,在这些平台几乎是查询不到的
以该平台为例,该平台记录90万亿条,什么概念?如果我们的密码由数字和字母组成,那一位密码的结果种类有26*2+10,即62种,只要8位,其结果种类就能轻松达到90万亿这个数字,如果加上字符,其产生的结果将更加庞大,所以不能穷举所有的对应关系,只能记录很小一部分(简单明文)
如何保证原文的复杂性:(可综合使用以下3种)
-要求用户使用强度更高的原始密码
-要求使用较长的密码
-要求密码中包含的字符种类更多样化
-加盐(salt):即在用户输入的密码中再加入字符串
- 理论上,盐值越复杂越好,但是,也没有必要过度复杂
- 盐值的具体使用也没有规定,原则上,只要能被运算数据变复杂即可
- 循环加密
- 将第一次运算得到的密文,作为原文,进行第2次运算,如此循环多次
- 使用长度更长的消息摘要算法
public class DigestTest{
public static void main(String[] args) {
String rawPassword = "Java_1956"; //明文
String salt = "helloword"; //盐值
String encodedPassword = DigestUtils //密文
.md5DigestAsHex((salt + rawPassword + salt).getBytes());
for(int i=0;i<5;i++){ //将密文循环加密
encodedPassword = DigestUtils
.md5DigestAsHex(encodedPassword.getBytes());
}
System.println.out("原始密码="+rawPassword+",MD5运算结果="+encodedPassword)
//输出结果为:原始密码=Java_1956,MD5运算结果=b440d2c2bafe262b0006ed0eec8a0544
}
}