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

如何使用Java中的加密函数实现数据的加密、解密和安全传输

发布时间:2023-06-21 08:50:45

在Java中,我们可以使用一系列的加密函数来实现数据的加密、解密和安全传输。这些加密函数包括对称加密、非对称加密、消息摘要、数字签名和证书认证等。下面我们将针对这些加密函数展开讲解。

1. 对称加密

对称加密是加密和解密使用相同密钥的加密方法,也被称为共享密钥加密。Java中常用的对称加密算法有DES、AES等。其中,DES算法已经被认为不安全,而AES算法是目前最常用的对称加密算法之一。Java中AES算法的使用如下:

import javax.crypto.*;
import javax.crypto.spec.*;

public class AESEncryptUtil {
    private static Cipher cipher = null;
    private static final String key = "1234567890123456";

    static{
        try{
            cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        } catch(Throwable t){
            t.printStackTrace();
        }
    }

    /**
     * 加密
     * @param input 需要加密的字符串
     * @return 加密后的字符串
     */
    public static String encrypt(String input){
        try{
            IvParameterSpec iv = new IvParameterSpec(key.getBytes("UTF-8"));
            SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes("UTF-8"), "AES");
            cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);
            byte[] encrypted = cipher.doFinal(input.getBytes());
            return Base64.getEncoder().encodeToString(encrypted);
        } catch(Throwable t){
            t.printStackTrace();
        }
        return null;
    }

    /**
     * 解密
     * @param input 需要解密的字符串
     * @return 解密后的字符串
     */
    public static String decrypt(String input){
        try{
            IvParameterSpec iv = new IvParameterSpec(key.getBytes("UTF-8"));
            SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes("UTF-8"), "AES");
            cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);
            byte[] original = cipher.doFinal(Base64.getDecoder().decode(input));
            return new String(original);
        } catch(Throwable t){
            t.printStackTrace();
        }
        return null;
    }
}

2. 非对称加密

非对称加密是一种使用不同密钥进行加密和解密的加密方法。Java中常用的非对称加密算法有RSA、DSA等。其中,RSA算法是目前最常用的非对称加密算法之一。Java中RSA算法的使用如下:

import java.security.*;
import javax.crypto.*;

public class RSAEncryptUtil {
    /**
     * 生成公钥和私钥
     * @return KeyPair
     */
    public static KeyPair getKeyPair() throws Exception{
        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
        keyPairGenerator.initialize(1024);
        return keyPairGenerator.generateKeyPair();
    }

    /**
     * 获取公钥
     * @param keyPair
     * @return PublicKey
     */
    public static PublicKey getPublicKey(KeyPair keyPair){
        return keyPair.getPublic();
    }

    /**
     * 获取私钥
     * @param keyPair
     * @return PrivateKey
     */
    public static PrivateKey getPrivateKey(KeyPair keyPair){
        return keyPair.getPrivate();
    }

    /**
     * 加密
     * @param input 需要加密的字符串
     * @param publicKey 公钥
     * @return 加密后的字符串
     */
    public static String encrypt(String input, PublicKey publicKey) throws Exception{
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.ENCRYPT_MODE, publicKey);
        byte[] encrypted = cipher.doFinal(input.getBytes());
        return Base64.getEncoder().encodeToString(encrypted);
    }

    /**
     * 解密
     * @param input 需要解密的字符串
     * @param privateKey 私钥
     * @return 解密后的字符串
     */
    public static String decrypt(String input, PrivateKey privateKey) throws Exception{
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.DECRYPT_MODE, privateKey);
        byte[] decrypted = cipher.doFinal(Base64.getDecoder().decode(input));
        return new String(decrypted);
    }
}

3. 消息摘要

消息摘要是将任意长度的数据转换成固定长度摘要的加密方法。Java中常用的消息摘要算法有MD5、SHA-1、SHA-256等。其中,MD5算法已经被认为不安全,而SHA-256算法是目前最常用且安全性较高的消息摘要算法之一。Java中SHA-256算法的使用如下:

import java.security.*;

public class SHA256Util {
    /**
     * 对字符串进行SHA256加密
     * @param input 需要加密的字符串
     * @return 加密后的字符串
     */
    public static String encrypt(String input) throws Exception{
        MessageDigest messageDigest = MessageDigest.getInstance("SHA-256");
        messageDigest.update(input.getBytes());
        byte[] encrypted = messageDigest.digest();
        return Base64.getEncoder().encodeToString(encrypted);
    }
}

4. 数字签名

数字签名是将消息摘要和加密密钥组合起来的一种加密方法,用于保证消息的完整性和真实性。Java中常用的数字签名算法有DSA、RSA等。Java中RSA算法的数字签名使用如下:

import java.security.*;
import java.security.spec.*;
import javax.crypto.*;

public class RSASignatureUtil {
    /**
     * 获取私钥
     * @param privateKeyStr 私钥字符串
     * @return PrivateKey
     */
    public static PrivateKey getPrivateKey(String privateKeyStr) throws Exception{
        byte[] keyBytes = Base64.getDecoder().decode(privateKeyStr.getBytes());
        PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes);
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        return keyFactory.generatePrivate(keySpec);
    }

    /**
     * 获取公钥
     * @param publicKeyStr 公钥字符串
     * @return PublicKey
     */
    public static PublicKey getPublicKey(String publicKeyStr) throws Exception{
        byte[] keyBytes = Base64.getDecoder().decode(publicKeyStr.getBytes());
        X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        return keyFactory.generatePublic(keySpec);
    }

    /**
     * 签名
     * @param input 需要签名的字符串
     * @param privateKey 私钥
     * @return 签名
     */
    public static String sign(String input, PrivateKey privateKey) throws Exception{
        Signature signature = Signature.getInstance("SHA256withRSA");
        signature.initSign(privateKey);
        signature.update(input.getBytes());
        return Base64.getEncoder().encodeToString(signature.sign());
    }

    /**
     * 验证签名
     * @param input 需要验证的字符串
     * @param signature 签名
     * @param publicKey 公钥
     * @return 是否验证通过
     */
    public static boolean verify(String input, String signature, PublicKey publicKey) throws Exception{
        Signature sig = Signature.getInstance("SHA256withRSA");
        sig.initVerify(publicKey);
        sig.update(input.getBytes());
        return sig.verify(Base64.getDecoder().decode(signature.getBytes()));
    }
}

5. 证书认证

证书认证是使用数字证书来验证通信方身份的一种方法。Java中常用的证书认证方式有密钥库认证和服务器验证等。Java中密钥库认证的使用如下:

`java

import java.io.*;

import java.security.*;

import java.security.cert.*;

public class CertificateUtil {

/**

* 读取密钥库

* @param keyStorePath 密钥库路径

* @param password 密钥库密码

* @param alias 别名

* @return

*/

public static KeyStore getKeyStore(String keyStorePath, String password, String alias) throws Exception{

FileInputStream fis = null;

KeyStore keyStore = null;

try{

fis = new FileInputStream(keyStorePath);

keyStore = KeyStore.getInstance("JKS");

keyStore.load(fis, password.toCharArray());

} finally{

if(fis != null){

try{

fis.close();

} catch(IOException e){

e.printStackTrace();

}

}

}

return keyStore;

}

/**

* 获取