java RA5 加密解密

业务场景

通常项目中的密码等敏感信息 不希望直接明文存储在数据库表中,希望加密存储到数据库中。这里提供一种加密解密工具

添加依赖

<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.8.0</version>
</dependency>

工具类

import java.io.File;
import java.nio.charset.Charset;
import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64;

import javax.crypto.Cipher;

import org.apache.commons.io.FileUtils;

public class RSAUtil {

    private static String algorithm = "RSA"; // 加密算法
    private static String pubPath = "C:\\key\\publickey";
    private static String priPath = "C:\\key\\privatekey";

    /**
     * 生成密钥对并保存在本地文件中
     *
     * @param algorithm : 算法
     * @param pubPath   : 公钥保存路径
     * @param priPath   : 私钥保存路径
     * @throws Exception
     */
    public static void generateKeyToFile(String algorithm, String pubPath, String priPath) throws Exception {
        // 创建密钥对生成器对象
        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(algorithm);
        // 生成密钥对
        KeyPair keyPair = keyPairGenerator.generateKeyPair();
        // 生成公钥 私钥
        PublicKey publicKey = keyPair.getPublic();
        PrivateKey privateKey = keyPair.getPrivate();
        // 获取公私钥字节数组
        byte[] publicKeyEncoded = publicKey.getEncoded();
        byte[] privateKeyEncoded = privateKey.getEncoded();
        // 对公私钥进行base64编码
        String publicKeyString = Base64.getEncoder().encodeToString(publicKeyEncoded);
        String privateKeyString = Base64.getEncoder().encodeToString(privateKeyEncoded);
        // 保存公私钥到文件
        FileUtils.writeStringToFile(new File(pubPath), publicKeyString, Charset.forName("UTF-8"));
        FileUtils.writeStringToFile(new File(priPath), privateKeyString, Charset.forName("UTF-8"));

    }

    /**解密
     * @param encrypted:密文
     * @return:原文
     * @throws Exception
     */
    public static String decryptRSA(String encrypted) throws Exception {

        // 将文件内容转为字符串
        String privateKeyString = FileUtils.readFileToString(new File(priPath), Charset.defaultCharset());
        // 获取密钥工厂
        KeyFactory keyFactory = KeyFactory.getInstance(algorithm);
        // 构建密钥规范 进行Base64解码
        PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(Base64.getDecoder().decode(privateKeyString));
        // 生成私钥
        PrivateKey key = keyFactory.generatePrivate(spec);

        // 创建加密对象
        Cipher cipher = Cipher.getInstance(algorithm);
        // 进行解密
        cipher.init(Cipher.DECRYPT_MODE, key);
        // 由于密文进行了Base64编码, 在这里需要进行解码
        byte[] decode = Base64.getDecoder().decode(encrypted);
        // 对密文进行解密,不需要使用base64,因为原文不会乱码
        byte[] bytes1 = cipher.doFinal(decode);
        return new String(bytes1);

    }

    /**
     * 使用密钥加密数据
     * 
     * @param input :原文
     * @return :密文
     * @throws Exception
     */
    public static String encryptRSA(String input) throws Exception {

        // 将文件内容转为字符串
        String publicKeyString = FileUtils.readFileToString(new File(pubPath), Charset.defaultCharset());
        // 获取密钥工厂
        KeyFactory keyFactory = KeyFactory.getInstance(algorithm);
        // 构建密钥规范 进行Base64解码
        X509EncodedKeySpec spec = new X509EncodedKeySpec(Base64.getDecoder().decode(publicKeyString));

        PublicKey key = keyFactory.generatePublic(spec);

        // 创建加密对象
        Cipher cipher = Cipher.getInstance(algorithm);
        // 初始化加密
        cipher.init(Cipher.ENCRYPT_MODE, key);
        // 私钥加密
        byte[] bytes = cipher.doFinal(input.getBytes());
        // 对密文进行Base64编码
        return Base64.getEncoder().encodeToString(bytes);
    }
}

调用

调用generateKeyToFile()方法一次,生成密钥并保存到C:\key 中

需要加密时,在项目中调用RSAUtil.decryptRSA("input") 返回密文

需要解密时,在项目中调用RSAUtil.encryptRSA("input")返回明文

上一篇:C++ algorithm值binary_search


下一篇:sharding-jdbc精确分片配置