您的位置:

Java加密算法详解

一、对称加密算法

对称加密算法是一种加密和解密使用同样密钥的算法,常见的对称加密算法有DES、3DES、AES等。在Java中,通过Cipher类提供对称加密的实现。

下面为使用AES对称加密算法的代码示例:

import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;

public class AESEncryptUtil {

    private static final String AES_ALGORITHM = "AES/ECB/PKCS5Padding";
    private static final String CHARSET_NAME = "UTF-8";

    public static byte[] encrypt(String content, String password) throws Exception {
        Cipher cipher = Cipher.getInstance(AES_ALGORITHM);
        byte[] byteContent = content.getBytes(CHARSET_NAME);
        SecretKeySpec key = new SecretKeySpec(password.getBytes(CHARSET_NAME), "AES");
        cipher.init(Cipher.ENCRYPT_MODE, key);
        return cipher.doFinal(byteContent);
    }

    public static byte[] decrypt(byte[] content, String password) throws Exception {
        Cipher cipher = Cipher.getInstance(AES_ALGORITHM);
        SecretKeySpec key = new SecretKeySpec(password.getBytes(CHARSET_NAME), "AES");
        cipher.init(Cipher.DECRYPT_MODE, key);
        return cipher.doFinal(content);
    }
}

我们可以看到,在使用Java对称加密算法的时候,我们需要指定具体的算法、加密模式和填充方式,并需要提供密钥。

二、非对称加密算法

非对称加密算法是一种加密和解密使用不同密钥的算法,常见的非对称加密算法有RSA、DSA等。在Java中,通过KeyPairGenerator类提供非对称加密算法的实现。

下面为使用RSA非对称加密算法的代码示例:

import java.security.KeyPairGenerator;
import java.security.KeyPair;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Signature;

public class RSAEncryptUtil {

    private static final String RSA_ALGORITHM = "RSA";
    private static final String SIGNATURE_ALGORITHM = "SHA1withRSA";
    private static final String CHARSET_NAME = "UTF-8";

    public static KeyPair getKeyPair() throws Exception {
        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(RSA_ALGORITHM);
        keyPairGenerator.initialize(2048);
        KeyPair keyPair = keyPairGenerator.generateKeyPair();
        return keyPair;
    }

    public static byte[] signature(String content, PrivateKey privateKey) throws Exception {
        Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
        signature.initSign(privateKey);
        byte[] byteContent = content.getBytes(CHARSET_NAME);
        signature.update(byteContent);
        return signature.sign();
    }

    public static boolean verify(String content, byte[] sign, PublicKey publicKey) throws Exception {
        Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
        signature.initVerify(publicKey);
        byte[] byteContent = content.getBytes(CHARSET_NAME);
        signature.update(byteContent);
        return signature.verify(sign);
    }
}

在使用Java非对称加密算法的时候,我们需要首先生成公钥私钥对,然后根据具体算法和填充方式进行签名、验证等操作。

三、哈希算法

哈希算法是一种将任意长度的消息压缩到某一固定长度的算法,常见的哈希算法有MD5、SHA-1、SHA-256等。在Java中,通过MessageDigest类提供哈希算法的实现。

下面为使用MD5哈希算法的代码示例:

import java.security.MessageDigest;

public class MD5Util {

    private static final String MD5_ALGORITHM = "MD5";
    private static final String CHARSET_NAME = "UTF-8";

    public static String md5(String content) throws Exception {
        MessageDigest messageDigest = MessageDigest.getInstance(MD5_ALGORITHM);
        byte[] byteContent = content.getBytes(CHARSET_NAME);
        byte[] md5Bytes = messageDigest.digest(byteContent);
        return byteArrayToHexString(md5Bytes);
    }

    private static String byteArrayToHexString(byte[] data) {
        StringBuilder stringBuilder = new StringBuilder();
        for (byte b : data) {
            stringBuilder.append(String.format("%02x", b & 0xff));
        }
        return stringBuilder.toString();
    }
}

在使用Java哈希算法的时候,我们需要选择具体算法,并将需要进行哈希的内容转换为字节数组并进行哈希计算,最终的哈希结果一般以十六进制字符串的形式呈现。

四、数字证书

数字证书是一种用于保证网络传输的信息安全的一种安全技术,其利用了非对称加密算法和数字签名算法。在Java中,通过KeyStore类提供数字证书的管理和使用。

下面为使用数字证书的代码示例:

import java.io.FileInputStream;
import java.security.KeyStore;
import java.security.PrivateKey;
import java.security.cert.Certificate;

public class DigitalCertificateUtil {

    private static final String KEYSTORE_PATH = "/path/to/keystore";
    private static final String KEYSTORE_PASSWORD = "keystore_password";
    private static final String CERTIFICATE_ALIAS = "certificate_alias";
    private static final String CERTIFICATE_PASSWORD = "certificate_password";

    public static PrivateKey getPrivateKey() throws Exception {
        KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
        FileInputStream fileInputStream = new FileInputStream(KEYSTORE_PATH);
        keyStore.load(fileInputStream, KEYSTORE_PASSWORD.toCharArray());
        return (PrivateKey) keyStore.getKey(CERTIFICATE_ALIAS, CERTIFICATE_PASSWORD.toCharArray());
    }

    public static Certificate getCertificate() throws Exception {
        KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
        FileInputStream fileInputStream = new FileInputStream(KEYSTORE_PATH);
        keyStore.load(fileInputStream, KEYSTORE_PASSWORD.toCharArray());
        return keyStore.getCertificate(CERTIFICATE_ALIAS);
    }
}

在使用Java数字证书的时候,我们需要指定证书的Keystore路径、密码以及证书的别名和密码,并通过KeyStore类获取和管理证书和私钥。