欢迎访问宙启技术站
智能推送

Java加密函数-了解Java中如何使用加密算法的函数。

发布时间:2023-06-20 15:52:44

Java是现今最流行的编程语言之一,提供了多种加密算法供开发者使用。对于需要保护敏感数据的应用,使用加密算法可以有效地降低数据泄露的风险。本文将介绍Java中常用的加密算法及其相关的函数。

一、对称加密算法

对称加密算法是指使用同一密钥对数据进行加密和解密的加密算法。常用的对称加密算法有DES、3DES、AES等。

Java中对称加密算法的使用需要借助javax.crypto包和java.security包。下面是一份使用AES算法进行加密和解密的代码示例:

import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.util.Base64;

public class AesUtils {

    private static final String ALGORITHM = "AES";
    private static final String CIPHER_TRANSFORMATION = "AES/ECB/PKCS5Padding";

    /**
     * 使用指定的密钥和明文进行AES加密
     *
     * @param data          明文
     * @param encryptKey    密钥
     * @return              Base64编码的密文
     * @throws Exception    加密失败抛出异常
     */
    public static String encrypt(String data, String encryptKey) throws Exception {
        SecretKeySpec secretKey = new SecretKeySpec(encryptKey.getBytes(StandardCharsets.UTF_8), ALGORITHM);
        Cipher cipher = Cipher.getInstance(CIPHER_TRANSFORMATION);
        cipher.init(Cipher.ENCRYPT_MODE, secretKey);
        byte[] encryptedData = cipher.doFinal(data.getBytes(StandardCharsets.UTF_8));
        return Base64.getEncoder().encodeToString(encryptedData);
    }

    /**
     * 使用指定的密钥和密文进行AES解密
     *
     * @param data          Base64编码的密文
     * @param decryptKey    密钥
     * @return              明文
     * @throws Exception    解密失败抛出异常
     */
    public static String decrypt(String data, String decryptKey) throws Exception {
        SecretKeySpec secretKey = new SecretKeySpec(decryptKey.getBytes(StandardCharsets.UTF_8), ALGORITHM);
        Cipher cipher = Cipher.getInstance(CIPHER_TRANSFORMATION);
        cipher.init(Cipher.DECRYPT_MODE, secretKey);
        byte[] decryptedData = cipher.doFinal(Base64.getDecoder().decode(data));
        return new String(decryptedData, StandardCharsets.UTF_8);
    }
}

二、非对称加密算法

非对称加密算法指使用一对密钥(公钥和私钥)对数据进行加密和解密的算法。常用的非对称加密算法有RSA、DSA、EC等。

Java中非对称加密算法的使用同样需要借助javax.crypto包和java.security包。下面是一个使用RSA算法进行加密和解密的代码示例:

import java.nio.charset.StandardCharsets;
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 javax.crypto.Cipher;

public class RsaUtils {

    private static final String ALGORITHM = "RSA";

    /**
     * 生成RSA公钥和私钥
     *
     * @param keySize   密钥长度
     * @return      KeyPair对象
     * @throws Exception    密钥生成失败抛出异常
     */
    public static KeyPair generateKeyPair(int keySize) throws Exception {
        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(ALGORITHM);
        keyPairGenerator.initialize(keySize);
        return keyPairGenerator.generateKeyPair();
    }

    /**
     * 使用RSA公钥进行加密
     *
     * @param publicKey     RSA公钥
     * @param data          明文
     * @return              Base64编码的密文
     * @throws Exception    加密失败抛出异常
     */
    public static String encrypt(PublicKey publicKey, String data) throws Exception {
        Cipher cipher = Cipher.getInstance(ALGORITHM);
        cipher.init(Cipher.ENCRYPT_MODE, publicKey);
        byte[] encryptedData = cipher.doFinal(data.getBytes(StandardCharsets.UTF_8));
        return Base64.getEncoder().encodeToString(encryptedData);
    }

    /**
     * 使用RSA私钥进行解密
     *
     * @param privateKey    RSA私钥
     * @param data          Base64编码的密文
     * @return              明文
     * @throws Exception    解密失败抛出异常
     */
    public static String decrypt(PrivateKey privateKey, String data) throws Exception {
        Cipher cipher = Cipher.getInstance(ALGORITHM);
        cipher.init(Cipher.DECRYPT_MODE, privateKey);
        byte[] decryptedData = cipher.doFinal(Base64.getDecoder().decode(data));
        return new String(decryptedData, StandardCharsets.UTF_8);
    }

    /**
     * 将Base64编码的公钥字符串转换成PublicKey对象
     *
     * @param publicKeyStr  Base64编码的公钥字符串
     * @return      PublicKey对象
     * @throws Exception    转换失败抛出异常
     */
    public static PublicKey getPublicKey(String publicKeyStr) throws Exception {
        byte[] keyBytes = Base64.getDecoder().decode(publicKeyStr);
        X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(keyBytes);
        KeyFactory keyFactory = KeyFactory.getInstance(ALGORITHM);
        return keyFactory.generatePublic(x509EncodedKeySpec);
    }

    /**
     * 将Base64编码的私钥字符串转换成PrivateKey对象
     *
     * @param privateKeyStr Base64编码的私钥字符串
     * @return      PrivateKey对象
     * @throws Exception    转换失败抛出异常
     */
    public static PrivateKey getPrivateKey(String privateKeyStr) throws Exception {
        byte[] keyBytes = Base64.getDecoder().decode(privateKeyStr);
        PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(keyBytes);
        KeyFactory keyFactory = KeyFactory.getInstance(ALGORITHM);
        return keyFactory.generatePrivate(pkcs8EncodedKeySpec);
    }
}

三、哈希算法

哈希算法是指将任意长度的消息通过哈希函数转换成固定长度的消息摘要的算法。常用的哈希算法有MD5、SHA-1、SHA-256等。

Java中哈希算法的使用需要借助java.security包。下面是一个使用SHA-256算法进行哈希的代码示例:

import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;

public class Sha256Utils {

    private static final String ALGORITHM = "SHA-256";

    /**
     * 使用SHA-256算法进行哈希
     *
     * @param data  明文
     * @return      Base64编码的哈希值
     * @throws Exception    哈希失败抛出异常
     */
    public static String hash(String data) throws Exception {
        MessageDigest messageDigest = MessageDigest.getInstance(ALGORITHM);
        byte[] hashBytes = messageDigest.digest(data.getBytes(StandardCharsets.UTF_8));
        return Base64.getEncoder().encodeToString(hashBytes);
    }
}

总结

本文介绍了Java中常用的加密算法及其相关的函数。使用加密算法可以有效地保护敏感数据,但也需要注意安全性和性能的平衡。在实际应用中需要根据具体情况选择适合的加密算法和密钥长度。