Mybatis密码加密

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: 将程序数据库连接信息中的密码信息,由明文的方式改成了密文,加大程序的安全性和规范性。加密方法使用RSA非对称加密。工具使用:Hutool

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

前言

这是初学者的一个 必经的坑和坏习惯:数据库连接信息 用户名密码在配置文件中是 以明文显示

造成这样的原因很简单:熟悉技术需要快速了解核心内容,先学会使用,再学会安全。

看完本章内容,你将会从玩具密码root:

jdbc.password=root
进阶成 真正的密码!

jdbc.password=KgIKU8yJozGvKRvx0AClN2XJqjd3DrlrcVYTyy0PpFEEymrxGhrln2I6NMO8HjbGezHuTCC/0yDTYNpCENh8q3G60db4RhEGxmLzqMZfBrvTfg/FSWW92+HWX/16fQYjoisjBZn8rnwPrClSc8YX7L2joN+P18odA5ozEMixfVE=

工具HuTool

一个很全的Java 工具类库,提高工作效率!

方法需要使用加密算法,而HuTool刚好有加密的API,拿来用即可!
🎈中文文档:入门和安装 (hutool.cn)

使用Maven安装

<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.7.22</version>
</dependency>

核心步骤

graph TD
明文 --> 加密 --> 密文-->解密-->数据库连接
加密选择:非对称加密

加密选择只是作者自己的一种加密方式,非对称加密是指会生成两个不同的秘钥:公钥私钥,如果一个用于加密,另外一个就只能用于解密。

其他加密方式还有:对称加密摘要加密等,加密手段。

TIPS:加密相关的内容并非本文重点。

明文加密成密文

我们的密码,在初始阶段都是自己设定的,例如root,当然程序在最终读取密码并进行配置的时候也是读取root

为什么需要密文?

作者遇到过这个情况: 我公开的代码中,包含了数据库的用户名和密码,都是以明文暴露的,或者其他类似的隐私数据,直接以明文暴露出来。 导致数据库被他人连接,测试
当密码 root通过加密变成了 KgIKU8yJozGvKRvx0AClN2XJqj...,而其他用户又没有解密的 秘钥,就无法通过用户名,密码的方式连接你的数据库了, 安全!

代码

// 使用非对称加密:RSA,会自动帮我们生成公钥和私钥
RSA rsa = new RSA();
// 获取私钥【保存】
String privateKeyBase64 = rsa.getPrivateKeyBase64();
System.out.println("私钥:" + privateKeyBase64);
// 获取公钥
String publicKeyBase64 = rsa.getPublicKeyBase64();
System.out.println("公钥:" + publicKeyBase64);
// 使用公钥将密码root加密,变成密文
byte[] encrypt = rsa.encrypt(StrUtil.bytes("root"), KeyType.PublicKey);
// 将密文用Base64编码,防止出现乱码,这个输出的密文,【我们保留使用】
String encode = Base64.encode(encrypt);
System.out.println("使用公钥加密后:" + StrUtil.str(encode,CharsetUtil.CHARSET_UTF_8));
// 将Base64编码后的密文,通过Base64反编译回去
byte[] decode = Base64.decode(encode);
// 使用私钥进行解密
byte[] decrypt = rsa.decrypt(decode, KeyType.PrivateKey);
// 将解密的内容,使用字符串显示出来
System.out.println("使用私钥解密后:" + StrUtil.str(decrypt,CharsetUtil.CHARSET_UTF_8));

该程序运行的结果如下图:

image.png

记住!
运行后,我们需要

  • 保存私钥(因为公钥用来加密了)
  • 保存密文(将密文替换明文)

之后程序拿到密文,拿到私钥,就可以通过私钥要密文解密

为什么可以做到安全呢?

首先用户 无法光从密文推理得到明文,其次,秘钥可以通过文件流读取的方式获得,不直接写在程序中。当然 服务器安全又是另外的内容了

编写解密的工具类

graph TD
读取秘钥文件 --> 获得秘钥 --> 将密文用秘钥解密 --> 得出明文

代码

public class Decrypt {
    public static String decrypt(String encode) throws IOException {
        String decode = null;
        // 获取传入的密文
        decode = encode;
        // 读取秘钥文件
        FileInputStream inputStream = new FileInputStream("src/main/resources/privateKey");
        BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);
        byte[] bytes = new byte[1024];
        int len = 0;
        String key = null;
        // 得到秘钥文件
        while ((len = bufferedInputStream.read(bytes))!=-1){
            key = new String(bytes, 0, len);
        }
        // 通过RSA解密,只需需要传入秘钥即可
        RSA rsa = new RSA(key, null);
        // 将密文使用Base64编码反编译
        byte[] decryptCode = Base64.decode(decode);
        // 解密
        byte[] decrypt = rsa.decrypt(decode, KeyType.PrivateKey);
        // 将解密的内容,使用字符串显示出来
        String res = StrUtil.str(decrypt, CharsetUtil.CHARSET_UTF_8);
        bufferedInputStream.close();
        inputStream.close();
        // 返回明文
        return res;
    }
}

核心解释:

  1. FileInputStream使用文件流的方式读取私钥
  2. RSA rsa = new RSA(key, null)构建一个RSA类对象,只传入私钥(用私钥解密)
  3. rsa.decrypt(decode, KeyType.PrivateKey)使用decrypt方法解密
  4. StrUtil.str(decrypt, CharsetUtil.CHARSET_UTF_8)将解密的内容转成String字符串并返回

在SSM框架中使用

使用了密文替换明文

jdbc.password=KgIKU8yJozGvKRvx0AClN2XJqjd3DrlrcVYTyy0PpFEEymrxGhrln2I6NMO8HjbGezHuTCC/0yDTYNpCENh8q3G60db4RhEGxmLzqMZfBrvTfg/FSWW92+HWX/16fQYjoisjBZn8rnwPrClSc8YX7L2joN+P18odA5ozEMixfVE=

构造Druid数据池时,解密后加载

@Bean
public DataSource dataSource(){
    DruidDataSource dataSource = new DruidDataSource();
    dataSource.setDriverClassName(driverClassName);
    dataSource.setUrl(url);
    dataSource.setUsername(userName);
    dataSource.setPassword(getDecryptPassword(password));
    dataSource.setInitialSize(initialSize);
    return dataSource;
}

private String getDecryptPassword(String password){
    try {
        // 这里使用了我们的解密方式
        return Decrypt.decrypt(password);
    } catch (IOException e) {
        e.printStackTrace();
    }
    return null;
}
目录
相关文章
|
3月前
|
存储 NoSQL 数据库
认证服务---整合短信验证码,用户注册和登录 ,密码采用MD5加密存储 【二】
这篇文章讲述了在分布式微服务系统中添加用户注册和登录功能的过程,重点介绍了用户注册时通过远程服务调用第三方服务获取短信验证码、使用Redis进行验证码校验、对密码进行MD5加密后存储到数据库,以及用户登录时的远程服务调用和密码匹配校验的实现细节。
认证服务---整合短信验证码,用户注册和登录 ,密码采用MD5加密存储 【二】
|
1月前
|
存储 Java 数据库
密码专辑:对密码加盐加密,对密码进行md5加密,封装成密码工具类
这篇文章介绍了如何在Java中通过加盐和加密算法(如MD5和SHA)安全地存储密码,并提供了一个密码工具类PasswordUtils和密码编码类PasswordEncoder的实现示例。
30 10
密码专辑:对密码加盐加密,对密码进行md5加密,封装成密码工具类
|
1月前
|
NoSQL Java Redis
shiro学习四:使用springboot整合shiro,正常的企业级后端开发shiro认证鉴权流程。使用redis做token的过滤。md5做密码的加密。
这篇文章介绍了如何使用Spring Boot整合Apache Shiro框架进行后端开发,包括认证和授权流程,并使用Redis存储Token以及MD5加密用户密码。
26 0
shiro学习四:使用springboot整合shiro,正常的企业级后端开发shiro认证鉴权流程。使用redis做token的过滤。md5做密码的加密。
|
1月前
|
安全 算法 Java
数据库信息/密码加盐加密 —— Java代码手写+集成两种方式,手把手教学!保证能用!
本文提供了在数据库中对密码等敏感信息进行加盐加密的详细教程,包括手写MD5加密算法和使用Spring Security的BCryptPasswordEncoder进行加密,并强调了使用BCryptPasswordEncoder时需要注意的Spring Security配置问题。
126 0
数据库信息/密码加盐加密 —— Java代码手写+集成两种方式,手把手教学!保证能用!
|
2月前
|
存储 安全 算法
RSA在手,安全我有!Python加密解密技术,让你的数据密码坚不可摧
【9月更文挑战第11天】在数字化时代,信息安全至关重要。传统的加密方法已难以应对日益复杂的网络攻击。RSA加密算法凭借其强大的安全性和广泛的应用场景,成为保护敏感数据的首选。本文介绍RSA的基本原理及在Python中的实现方法,并探讨其优势与挑战。通过使用PyCryptodome库,我们展示了RSA加密解密的完整流程,帮助读者理解如何利用RSA为数据提供安全保障。
121 5
|
2月前
|
安全 数据安全/隐私保护 Python
情书也能加密?Python AES&RSA,让每一份数据都充满爱的密码
【9月更文挑战第8天】在这个数字化时代,情书不再局限于纸笔,也可能以电子形式在网络中传递。为了确保其安全,Python提供了AES和RSA等加密工具,为情书编织爱的密码。首先,通过安装pycryptodome库,我们可以利用AES对称加密算法高效保护数据;接着,使用RSA非对称加密算法加密AES密钥和IV,进一步增强安全性。即使情书被截获,没有正确密钥也无法解读内容。让我们用Python为爱情编织一张安全的网,守护每份珍贵情感。
48 2
|
3月前
|
安全 数据安全/隐私保护 Python
|
3月前
|
安全 Nacos 数据安全/隐私保护
【技术干货】破解Nacos安全隐患:连接用户名与密码明文传输!掌握HTTPS、JWT与OAuth2.0加密秘籍,打造坚不可摧的微服务注册与配置中心!从原理到实践,全方位解析如何构建安全防护体系,让您从此告别数据泄露风险!
【8月更文挑战第15天】Nacos是一款广受好评的微服务注册与配置中心,但其连接用户名和密码的明文传输成为安全隐患。本文探讨加密策略提升安全性。首先介绍明文传输风险,随后对比三种加密方案:HTTPS简化数据保护;JWT令牌减少凭证传输,适配分布式环境;OAuth2.0增强安全,支持多授权模式。每种方案各有千秋,开发者需根据具体需求选择最佳实践,确保服务安全稳定运行。
317 0
|
5月前
|
算法 JavaScript 安全
一篇文章讲明白JavaScript_提交表单和MD5算法密码加密
一篇文章讲明白JavaScript_提交表单和MD5算法密码加密
49 0