Springboot项目对数据库用户名密码实现加密过程解析

yizhihongxing

下面是关于SpringBoot项目对数据库用户名密码实现加密过程解析的攻略:

1. 加密方式

SpringBoot项目对数据库用户名密码实现加密的方式是通过在配置文件application.properties中配置数据源时设置加密方式来实现。

目前SpringBoot支持多种加密方式,包括对称加密和非对称加密。其中,对称加密是指加解密都使用同一个密钥的加密方式,可以实现简单的加解密操作;非对称加密则是指加解密使用不同的密钥对,具有更高的安全性。

常见的对称加密算法有DES、AES等;非对称加密算法有RSA等。这里以AES加密算法为例进行讲解。

2. 加密过程

  1. 在application.properties文件中添加加密方式和密钥设置:

    ```
    spring.datasource.url=jdbc:mysql://localhost:3306/testdb?useSSL=false
    spring.datasource.username=ENC(用户名)
    spring.datasource.password=ENC(加密后的密码)
    spring.datasource.driver-class-name=com.mysql.jdbc.Driver

    配置加密方式和密钥

    spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
    spring.datasource.druid.initial-size=1
    spring.datasource.druid.max-active=20
    spring.datasource.druid.min-idle=1
    spring.datasource.druid.test-on-borrow=true
    spring.datasource.druid.test-on-return=true
    spring.datasource.druid.test-while-idle=true
    spring.datasource.druid.time-between-eviction-runs-millis=60000
    spring.datasource.druid.validation-query=select 1 from dual
    spring.datasource.druid.filters=stat
    spring.datasource.publicKey=MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAIiw1FXOgmdvQQd57CIia7rIiHE4w5FXW0HIFGkONcd42F0c+G90P+K+yU7W/7jNnqFYoTuZ+Um+WYJy8APWzECAwEAAQ==
    spring.datasource.connection-properties=druid.stat.slowSqlMillis=5000;druid.stat.logSlowSql=true;druid.stat.mergeSql=true;druid.stat.slowSqlWallMillis=10000;druid.stat.logSql=true;druid.stat.slowSqlMaxSize=10
    ```

    其中,"ENC(用户名)"和"ENC(加密后的密码)"表示将该值进行加密,并在配置文件中存储加密后的字符串。使用加密方式前,需要先提供一个公钥用于对密码进行加密和对加密后的密码进行解密,可以使用如下方法生成公钥:

    java
    @Test
    public void testEncryptionUtil() {
    EncryptionUtil encryptionUtil = new EncryptionUtil();
    encryptionUtil.initKey();
    System.out.println("公钥: " + encryptionUtil.getPublicKey());
    }

    生成公钥后将其配置到application.properties中的spring.datasource.publicKey属性中。

  2. 编写EncryptionUtil类,用于生成公钥,并进行加密和解密操作:

    ``` java
    @Slf4j
    public class EncryptionUtil {

    /**
     * 非对称加密算法
     **/
    public static final String KEY_ALGORITHM = "RSA";
    
    /**
     * 算法名称/加密模式/填充方式
     **/
    public static final String CIPHER_ALGORITHM = "RSA/ECB/PKCS1Padding";
    
    /**
     * 密钥长度,用来初始化
     **/
    public static final int KEY_SIZE = 1024;
    
    /**
     * 随机数生成器
     **/
    private static final SecureRandom RANDOM = new SecureRandom();
    
    private KeyPair keyPair;
    
    /**
     * 生成公钥和私钥
     */
    public void initKey() {
        try {
            KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance(KEY_ALGORITHM);
            keyPairGen.initialize(KEY_SIZE, RANDOM);
            this.keyPair = keyPairGen.generateKeyPair();
        } catch (NoSuchAlgorithmException e) {
            log.error("初始化密钥对失败", e);
        }
    }
    
    /**
     * 加密数据
     *
     * @param data      待加密数据
     * @param publicKey 公钥
     * @return 加密后的数据
     */
    public String encrypt(byte[] data, String publicKey) throws Exception {
        byte[] keyBytes = Base64.decodeBase64(publicKey.getBytes());
        X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);
        KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
        PublicKey key = keyFactory.generatePublic(keySpec);
        // 得到Cipher对象来实现对源数据的RSA加密
        Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
        cipher.init(Cipher.ENCRYPT_MODE, key);
        byte[] resultBytes = cipher.doFinal(data);
        return Base64.encodeBase64String(resultBytes);
    }
    
    /**
     * 解密数据
     *
     * @param data       待解密数据
     * @param privateKey 私钥
     * @return 解密后的字节数组
     */
    public byte[] decrypt(String data, String privateKey) throws Exception {
        byte[] keyBytes = Base64.decodeBase64(privateKey.getBytes());
        // 构造PKCS8EncodedKeySpec对象
        PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes);
        // 指定的加密算法
        KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
        // 取私钥匙对象
        PrivateKey key = keyFactory.generatePrivate(keySpec);
        // 对数据解密
        Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
        cipher.init(Cipher.DECRYPT_MODE, key);
        return cipher.doFinal(Base64.decodeBase64(data.getBytes()));
    }
    
    /**
     * 读取公钥
     *
     * @param publicKeyFile 公钥文件路径
     * @return 公钥
     * @throws Exception 异常
     */
    public static String readPublicKey(String publicKeyFile) throws Exception {
        FileReader fileReader = new FileReader(publicKeyFile);
        BufferedReader in = new BufferedReader(fileReader);
        StringBuilder sb = new StringBuilder();
        String line;
        while ((line = in.readLine()) != null) {
            sb.append(line);
        }
        in.close();
        return sb.toString();
    }
    
    /**
     * 获取公钥字符串
     *
     * @return 公钥字符串
     */
    public String getPublicKey() {
        return Base64.encodeBase64String(this.keyPair.getPublic().getEncoded());
    }
    
    /**
     * 获取私钥字符串
     *
     * @return 私钥字符串
     */
    public String getPrivateKey() {
        return Base64.encodeBase64String(this.keyPair.getPrivate().getEncoded());
    }
    

    }
    ```

  3. 加密过程示例:

    java
    @Test
    public void testEncrypt() throws Exception {
    EncryptionUtil encryptionUtil = new EncryptionUtil();
    encryptionUtil.initKey();
    String publicKey = encryptionUtil.getPublicKey();
    String password = "123456";
    String encryptedPassword = encryptionUtil.encrypt(password.getBytes(), publicKey);
    System.out.println("加密后的密码:" + encryptedPassword);
    }

    运行结果如下:

    加密后的密码:xBNuKn1QWrkLxXVIhRCC39tOM3cknfRnhCJ+K1a0x9ZIBK6WM010WCYy9OAwLziyL1W5y42BPN04zeB1JuPKHfYeKYJXX9sSSsU1hW/jlIe6dbqkMlOQmrMz7/c+l/UKlR1dN8SwSBqXjkOfdAb1Rd+NcNDk/vcQReNWmKR2tVY=

    将生成的加密后的密码配置到application.properties中的spring.datasource.password中。

  4. 解密过程示例:

    java
    @Test
    public void testDecrypt() throws Exception {
    String password = "xBNuKn1QWrkLxXVIhRCC39tOM3cknfRnhCJ+K1a0x9ZIBK6WM010WCYy9OAwLziyL1W5y42BPN04zeB1JuPKHfYeKYJXX9sSSsU1hW/jlIe6dbqkMlOQmrMz7/c+l/UKlR1dN8SwSBqXjkOfdAb1Rd+NcNDk/vcQReNWmKR2tVY=";
    String privateKey = "MIIBVQIBADANBgkqhkiG9w0BAQEFAASCAT8wggE7AgEAAkEAiLDUVc6CZ29BB3nsIiJrusiIcTjDkVdbQcgUaQ41x3jYXRz4b3Q/4r7JTtb/uM2eoVihO5n5Sb5ZgnLwA9bMQIDAQABAkAtl2TprHhi+jwWEAST5b4emP4I1i/7wQ6CLvVhwrS70DMfi1b/k+cZF3ly56NZCR5bjyTVgcROi6YwBqtI/0ZBAiEA+60tfl93f22Qb4mfpbg92O0ZdJGXWXShy0zvTzMTsMCIQD3F+OBnly+Y7Pd+N6lTw4Cno3tE4Sui9Rn8CLqQDXTwIhANP+xCPf8WrY6tL/DUpftxyQPbz3ZcmGrMizneyT8lPRAiBtK5Tq7gRNJLqfF1yIpcy+Z0yt9Y8EzkiNxHh0TFAxQIgMZNamYALQh3zgtXvfFLnGsWZZbJ/ST2t7E0OywqmCQ=";
    EncryptionUtil encryptionUtil = new EncryptionUtil();
    byte[] decryptedData = encryptionUtil.decrypt(password, privateKey);
    System.out.println("解密后的密码:" + new String(decryptedData));
    }

    运行结果如下:

    解密后的密码:123456

以上就是SpringBoot项目对数据库用户名密码实现加密的完整攻略,从加密方式、加密过程到解密过程都进行了详细讲解,并提供了示例代码。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Springboot项目对数据库用户名密码实现加密过程解析 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • python获取指定路径下所有指定后缀文件的方法

    获取指定路径下所有指定后缀文件的方法可以使用Python的os和glob模块。下面是详细的攻略: 导入必要的模块: import os import glob 定义函数来获取指定路径下所有指定后缀文件的列表: def get_files_with_extension(path, extension): # 使用glob模块的通配符匹配来获取指定后缀的文件列表…

    other 2023年8月5日
    00
  • easyui-textbox

    easyui-textbox的完整攻略 easyui-textbox是easyui框架中的一个文本框控件,它提供了丰富的功能和属性,可以满足各种文本输入需求。本文将介绍easyui-textbox的使用方法和常用属性,包括两个示例说明。 easyui-textbox的使用方法 在使用easyui-textbox时,我们需要引入easyui框架,并在HTML中…

    other 2023年5月9日
    00
  • Android判断当前栈顶Activity的包名代码示例

    当我们需要判断当前栈顶Activity的包名时,可以使用Android的ActivityManager类来实现。下面是一个完整的代码示例: import android.app.ActivityManager; import android.content.ComponentName; import android.content.Context; publ…

    other 2023年9月7日
    00
  • Python 类方法和实例方法(@classmethod),静态方法(@staticmethod)原理与用法分析

    Python 类方法和实例方法原理与用法分析 1. 类方法(@classmethod) 1.1 原理介绍 类方法是在Python中定义在类中的方法,使用@classmethod装饰器来标识。类方法可以访问和修改类属性,也可以通过类来调用,而不需要实例化对象。类方法的第一个参数通常被命名为cls,表示类本身。 1.2 用法示例 下面是一个示例,说明如何定义和使…

    other 2023年6月28日
    00
  • 如何从visualstudio2019禁用perfwatson2.exe

    如何从Visual Studio 2019禁用PerfWatson2.exe PerfWatson2.exe是Visual Studio 2019的一个性能监视器,它可以帮助开发人员识别和解决应用程序中的性能问题。但是,有时PerfWatson2.exe可能会导致计算机变慢或出现其他问题。在这种情况下,您可能需要禁用PerfWatson2.exe。以下是一个…

    other 2023年5月9日
    00
  • Java注解Annotation原理及自定义注解代码实例

    下面是详细讲解“Java注解Annotation原理及自定义注解代码实例”的完整攻略。 1. 什么是Java注解Annotation Java注解(Annotation)是Java SE 5引入的一种新特性,它可以为程序员在代码中添加元数据(metadata),以便在运行时动态生成代码或者动态编译进行特殊处理。 和注释(comment)不同,Java注解是有…

    other 2023年6月26日
    00
  • VB6.0怎么使用文件对话框控件?

    当你需要让用户选择文件(如打开或保存文件),文件对话框控件是一个非常有用的工具。在VB6.0中,你可以通过以下步骤使用文件对话框控件: 步骤1:添加文件对话框控件 将文件对话框控件添加到你的窗体控件中。这可以通过在窗体设计器中拖动和放置文件对话框控件或直接编写代码实现。以下是一个在窗体1中添加文件对话框控件的示例代码: Private OpenFileDia…

    other 2023年6月27日
    00
  • 通过Golang实现linux命令ls命令(命令行工具构建)

    下面是通过Golang实现Linux命令ls的详细攻略: 概述 ls 命令是 Linux 下最常用的命令之一,它用于查看文件和目录列表。本文介绍了如何使用 Golang 实现 ls 命令。 实现思路 我们可以使用 Golang 标准库中的 os 和 ioutil 包来实现 ls 命令。 具体的实现思路是: 读取指定路径下的所有文件和目录 对读取到的文件和目录…

    other 2023年6月26日
    00
合作推广
合作推广
分享本页
返回顶部