数据库数据加密

发布于:2025-05-29 ⋅ 阅读:(21) ⋅ 点赞:(0)

数据库存储明文密码非常危险,一旦数据泄密,用户的信息就会暴露出去,别人拿到密码等信息后什么都能干,因此我们需要对数据库的信息进行加密,这样即使数据库泄密后别人拿到密码也不知道原始的密码,就无法登录。

加密方式

摘要加密

例如: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"));

网站公告

今日签到

点亮在社区的每一天
去签到