数据库存储明文密码非常危险,一旦数据泄密,用户的信息就会暴露出去,别人拿到密码等信息后什么都能干,因此我们需要对数据库的信息进行加密,这样即使数据库泄密后别人拿到密码也不知道原始的密码,就无法登录。
加密方式
摘要加密
例如:md5,sha1,sha256......
摘要加密就是哈希值,通过散列的算法。摘要的概念主要是验证完整性和唯一性,不管秘密多长,或者多复杂,加密后得到的值都是固定长度。
摘要加密也是有一定的风险,例如:123456用md5加密后的值,其实是固定的,在一些反解密得网站上可以破解。md5是不可逆的,但是是固定的,如果你的md5库非常大的话,有很大概率可以反解密的,因此发明了对称加密。
// md5加密
SaSecureUtil.md5("123456");
// sha1加密
SaSecureUtil.sha1("123456");
// sha256加密
SaSecureUtil.sha256("123456");
对称加密
我们约定了一个密钥,这个密钥需要好好保存,不能泄漏,一旦泄漏,别人就可以进行逆向的解密了。
加密的过程:密码+密钥 生成
解密的过程:密文+密钥 反解
因此密钥一定要好好保存。
常见的对称加密算法:AES(高级加密标准),DES(数据加密标准),3DESC(三重数据加密算法),SM4(国家密码算法标准)...
问题:密钥会来回传递,也有可能真的会丢失,因此又发明了非对称加密。
// 定义秘钥和明文
String key = "123456";
String password = "2946884649";
// 加密
String ciphertext = SaSecureUtil.aesEncrypt(key, password);
System.out.println("AES加密后:" + ciphertext);
// 解密
String password2 = SaSecureUtil.aesDecrypt(key, ciphertext);
System.out.println("AES解密后:" + password2);
非对称加密
一个公钥,一个私钥
第一种方式:用公钥去加密,私钥去解密(常用这个)
第二种方式:用私钥去加密,公钥去解密
密钥来回传递时传递的仅仅是公钥
常见的非对称加密算法:RSA,ECC,国密的SM2
缺点:算法的时间性能上差一点,加密的数量没有对称加密快。
// 定义私钥和公钥
String privateKey = "MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAO+wmt01pwm9lHMdq7A8gkEigk0XKMfjv+4IjAFhWCSiTeP7dtlnceFJbkWxvbc7Qo3fCOpwmfcskwUc3VSgyiJkNJDs9ivPbvlt8IU2bZ+PBDxYxSCJFrgouVOpAr8ar/b6gNuYTi1vt3FkGtSjACFb002/68RKUTye8/tdcVilAgMBAAECgYA1COmrSqTUJeuD8Su9ChZ0HROhxR8T45PjMmbwIz7ilDsR1+E7R4VOKPZKW4Kz2VvnklMhtJqMs4MwXWunvxAaUFzQTTg2Fu/WU8Y9ha14OaWZABfChMZlpkmpJW9arKmI22ZuxCEsFGxghTiJQ3tK8npj5IZq5vk+6mFHQ6aJAQJBAPghz91Dpuj+0bOUfOUmzi22obWCBncAD/0CqCLnJlpfOoa9bOcXSusGuSPuKy5KiGyblHMgKI6bq7gcM2DWrGUCQQD3SkOcmia2s/6i7DUEzMKaB0bkkX4Ela/xrfV+A3GzTPv9bIBamu0VIHznuiZbeNeyw7sVo4/GTItq/zn2QJdBAkEA8xHsVoyXTVeShaDIWJKTFyT5dJ1TR++/udKIcuiNIap34tZdgGPI+EM1yoTduBM7YWlnGwA9urW0mj7F9e9WIQJAFjxqSfmeg40512KP/ed/lCQVXtYqU7U2BfBTg8pBfhLtEcOg4wTNTroGITwe2NjL5HovJ2n2sqkNXEio6Ji0QQJAFLW1Kt80qypMqot+mHhS+0KfdOpaKeMWMSR4Ij5VfE63WzETEeWAMQESxzhavN1WOTb3/p6icgcVbgPQBaWhGg==";
String publicKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDvsJrdNacJvZRzHauwPIJBIoJNFyjH47/uCIwBYVgkok3j+3bZZ3HhSW5Fsb23O0KN3wjqcJn3LJMFHN1UoMoiZDSQ7PYrz275bfCFNm2fjwQ8WMUgiRa4KLlTqQK/Gq/2+oDbmE4tb7dxZBrUowAhW9NNv+vESlE8nvP7XXFYpQIDAQAB";
// 文本
String text = "Sa-Token 一个轻量级java权限认证框架";
// 使用公钥加密
String ciphertext = SaSecureUtil.rsaEncryptByPublic(publicKey, text);
System.out.println("公钥加密后:" + ciphertext);
// 使用私钥解密
String text2 = SaSecureUtil.rsaDecryptByPrivate(privateKey, ciphertext);
System.out.println("私钥解密后:" + text2);
你可能会有疑问,私钥和公钥这么长的一大串,我怎么弄出来,手写吗?当然不是,调用以下方法生成即可
// 生成一对公钥和私钥,其中Map对象 (private=私钥, public=公钥)
System.out.println(SaSecureUtil.rsaGenerateKeyPair());
{private=MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAKijJtomHQ+4Yezdbw0NL9iEeTzCUbPA/My+Z+yyJp3Qwap5plvA2JhvXgKkYBtenXE5zyWn+CDD4bZ1Mu+rNCbL79UNGzqF+cfxfUV5PH6CWtlx5jUuy8fWm5HAlXOGg/rR1IsnyA52ls5bPtha/smRLK9jNbPtqd5UmIKRy8d9AgMBAAECgYA+3WtLYW/t/09KDJYsaGEQtvm3I71vZB8ZeFWnkBYDOOIpWeYhSDe2Q7XpCDvnmBLbNbC6Ge7O0BbhfLk7TThILrAd3iMcwsOZoW2m5kIRjT0OQhgxujo2kcB+i3+iw+IfdhugGvZr+zhq6NAlmk2hnXblaTNVVywd+kyd0uod4QJBAOMxsBhVAOWLid76HE2KmxsJX4UdB7+mzzVWPhMTu2EAuus0Op3TnnKt5n4DsP0uOI0eu1xtTH/sJClsK0wZMzUCQQC+BNDicpjrW8kkfY/XAg+sB6O+NvZljqYfaQN0WuoqWC3th9hYLS3eSa8GxGg77MEkfZT28SjglKEGwRTwFsQpAkAgRki7zCeKdF4rnOA0a8JI/vXg1RTqtumsrAm5cA4oY5AqJYtGLG/P3sBlmmSkMtK5yWnYYXaCnastbz5fWx0ZAkBX0UH4ZZ3mp/S9uInRhFJZ3u396sjVBqgfvBisnZe7GiWfsTh7B+Y65TLOndbOWwyoIKHHvox1vjrtNC7JBryBAkBnOY5K3428Hoyf6CV4L1Mcgs71aTYWYCP3Kah1o9/K5TUVHO2ZZrW+D71oGbPaw0gSC8VZfAErlNJPkjzuEhRv,
public=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCooybaJh0PuGHs3W8NDS/YhHk8wlGzwPzMvmfssiad0MGqeaZbwNiYb14CpGAbXp1xOc8lp/ggw+G2dTLvqzQmy+/VDRs6hfnH8X1FeTx+glrZceY1LsvH1puRwJVzhoP60dSLJ8gOdpbOWz7YWv7JkSyvYzWz7aneVJiCkcvHfQIDAQAB}
Creating a new SqlSession
其他加密:Sa-Token
加盐
摘要算法比如 md5,光加密123456,那么结果都是一样的,如果是破解库里正好有这个md5 就很容易知道密码是123456。因此可以通过加盐来提高安全性。盐是随机的字符串,他来与原密码进行一波二次加密。这样加密的密码就很难被破解出来。
// md5加密
// 未加盐
// user.setPassword(SaSecureUtil.md5(usersDTO.getPassword()));
// 加盐:后面跟一个字符串
user.setPassword(SaSecureUtil.md5BySalt(usersDTO.getPassword(),"qiao"));
如何在项目中添加加密
例如:我们对用户密码进行加密
1,首先我们引入satoken的依赖
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-spring-boot-starter</artifactId>
<version>1.40.0</version>
</dependency>
2,在需要加密密码的地方,用SaSecreUtil.这个工具类来操作。
3,加盐,例如:我们对md5密码加盐,加盐后很难再被破解工具破解了
// md5加密
// 未加盐
// user.setPassword(SaSecureUtil.md5(usersDTO.getPassword()));
// 加盐:后面跟一个字符串
user.setPassword(SaSecureUtil.md5BySalt(usersDTO.getPassword(),"qiao"));