Shiro--第2天--md5加密

1.MD5加密

比如123用MD5加密后是202cb962ac59075b964b07152d234b70,这个字符串确不能通过反编译得到123,
这个加密后的字符串就存在数据库里了,下次用户再登陆,输入密码 123, 同样用md5 加密后,再和这个字符串一比较,就知道密码是否正确了。
如此这样,既能保证用户密码校验的功能,又能保证不暴露密码。

注:
以下代码需要导包,在这里插入图片描述
下载地址:http://how2j.cn/k/shiro/shiro-encryption/1726.html?p=36286
在这里插入图片描述

package md5;
import org.apache.shiro.crypto.hash.Md5Hash;

public class TestEncryption {
	public static void main(String[] args) {
		String password = "123";
		String encodedPassword = new Md5Hash(password).toString();
		System.out.println(encodedPassword);
		//202cb962ac59075b964b07152d234b70
	}
}

输出结果:

202cb962ac59075b964b07152d234b70

2.盐

上面讲了md5加密,但是md5加密又有一些缺陷:1. 如果我的密码是 123,你的也是 123, 那么md5的值是一样的,那么通过比较加密后的字符串,我就可以反推过来,原来你的密码也是123.2. 与上述相同,虽然 md5 不可逆,但是我可以穷举法呀,我把特别常用的100万或者更多个密码的 md5 值记录下来,比如12345的,abcde的。 相当一部分人用的密码也是这些,那么只要到数据库里一找,也很快就可以知道原密码是多少了。这样看上去也就破解了,至少一部分没有想象中那么安全吧。
为了解决这个问题,引入了盐的概念。 盐是什么意思呢? 比如炒菜,直接使用md5,就是对食材(源密码)进行炒菜,因为食材是一样的,所以炒出来的味道都一样,可是如果加了不同分量的盐,那么即便食材一样,炒出来的味道也就不一样了。
所以,虽然每次 123 md5 之后都是202CB962AC59075B964B07152D234B70,但是 我加上盐,即 123+随机数,那么md5值不就不一样了吗? 这个随机数,就是盐,而这个随机数也会在数据库里保存下来,每个不同的用户,随机数也是不一样的。
再就是加密次数,加密一次是202CB962AC59075B964B07152D234B70,我可以加密两次呀,就是另一个数了。 而黑客即便是拿到了加密后的密码,如果不知道到底加密了多少次,也是很难办的。

package md5;
import org.apache.shiro.crypto.SecureRandomNumberGenerator;
import org.apache.shiro.crypto.hash.SimpleHash;

public class TestEncryptionSalt {
	public static void main(String[] args) {
		String password = "123";
		String salt = new SecureRandomNumberGenerator().nextBytes().toString();
		int times = 2;
		String algorithmName = "md5";
		String encodedPassword = new SimpleHash(algorithmName,password,salt,times).toString();
        System.out.printf("原始密码是 %s , 盐是: %s, 运算次数是: %d, 运算出来的密文是:%s ",password,salt,times,encodedPassword);
        //原始密码是 123 , 盐是: uzWE7wR6bB6f9hnkk/ChfQ==, 运算次数是: 2, 运算出来的密文是:942fec710541bec17a92e118c7b06835 
        //原始密码是 123 , 盐是: waQI4D6Oj8j5ppjtxQiZwQ==, 运算次数是: 2, 运算出来的密文是:37ce8f4365122f57cd02b61737c84ebe 
	}

}

输出结果:

//原始密码是 123 , 盐是: uzWE7wR6bB6f9hnkk/ChfQ==, 运算次数是: 2, 运算出来的密文是:942fec710541bec17a92e118c7b06835
//原始密码是 123 , 盐是: waQI4D6Oj8j5ppjtxQiZwQ==, 运算次数是: 2, 运算出来的密文是:37ce8f4365122f57cd02b61737c84ebe

猜你喜欢

转载自blog.csdn.net/qq_41293896/article/details/86553116