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

Java中常见的加密函数有哪些?如何使用它们?

发布时间:2023-06-06 01:30:18

Java中常见的加密函数包括消息摘要函数(Message Digest)、对称加密函数、不对称加密函数和数字签名函数。

消息摘要函数是一种用于验证数据完整性的加密函数,也称为哈希函数,它将任意长度的数据映射为固定长度的哈希值,可以用于常见的数据验证场景,如密码存储、用户身份验证等。Java中常见的消息摘要函数包括MD5和SHA。使用方式如下:

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;

public class MessageDigestDemo {
    public static void main(String[] args) throws NoSuchAlgorithmException {
        // 创建MessageDigest对象
        MessageDigest md5 = MessageDigest.getInstance("MD5");
        String password = "123456";
        // 更新数据
        md5.update(password.getBytes());
        // 计算哈希值
        byte[] digest = md5.digest();
        // 对哈希值进行Base64编码
        String base64 = Base64.getEncoder().encodeToString(digest);
        System.out.println(base64);
    }
}

对称加密函数是一种加密算法,使用相同的密钥对数据进行加密和解密。Java中常见的对称加密函数包括AES和DES。使用方式如下:

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;

public class AESEncryptDemo {
    public static void main(String[] args) throws Exception {
        // 生成密钥
        KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
        keyGenerator.init(128);
        SecretKey secretKey = keyGenerator.generateKey();
        byte[] keyBytes = secretKey.getEncoded();
        // 创建SecretKeySpec对象
        SecretKeySpec secretKeySpec = new SecretKeySpec(keyBytes, "AES");
        // 创建Cipher对象
        Cipher cipher = Cipher.getInstance("AES");
        // 加密
        cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);
        String data = "hello";
        byte[] encryptBytes = cipher.doFinal(data.getBytes());
        String base64 = Base64.getEncoder().encodeToString(encryptBytes);
        System.out.println(base64);
        // 解密
        cipher.init(Cipher.DECRYPT_MODE, secretKeySpec);
        byte[] decryptBytes = cipher.doFinal(Base64.getDecoder().decode(base64));
        String decryptData = new String(decryptBytes);
        System.out.println(decryptData);
    }
}

不对称加密函数是一种使用公钥和私钥进行加密和解密的算法,公钥用于加密数据,私钥用于解密数据。Java中常见的不对称加密函数包括RSA。使用方式如下:

import javax.crypto.Cipher;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.util.Base64;

public class RSAEncryptDemo {
    public static void main(String[] args) throws Exception {
        // 生成密钥对
        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
        keyPairGenerator.initialize(512); // 指定密钥长度
        KeyPair keyPair = keyPairGenerator.generateKeyPair();
        PublicKey publicKey = keyPair.getPublic();
        PrivateKey privateKey = keyPair.getPrivate();
        // 加密
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.ENCRYPT_MODE, publicKey);
        String data = "hello";
        byte[] encryptBytes = cipher.doFinal(data.getBytes());
        String base64 = Base64.getEncoder().encodeToString(encryptBytes);
        System.out.println(base64);
        // 解密
        cipher.init(Cipher.DECRYPT_MODE, privateKey);
        byte[] decryptBytes = cipher.doFinal(Base64.getDecoder().decode(base64));
        String decryptData = new String(decryptBytes);
        System.out.println(decryptData);
    }
}

数字签名函数是一种用于确保数据完整性和验证数据来源的函数,它将哈希值和私钥组成的数字签名附加在数据中,接收方使用公钥验证数据完整性和来源。Java中常见的数字签名函数包括DSA和RSA。使用方式如下:

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

public class SignatureDemo {
    public static void main(String[] args) throws Exception {
        // 生成密钥对
        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
        keyPairGenerator.initialize(512); // 指定密钥长度
        KeyPair keyPair = keyPairGenerator.generateKeyPair();
        PublicKey publicKey = keyPair.getPublic();
        PrivateKey privateKey = keyPair.getPrivate();
        // 签名
        Signature signature = Signature.getInstance("SHA256withRSA");
        signature.initSign(privateKey);
        String data = "hello";
        signature.update(data.getBytes());
        byte[] signBytes = signature.sign();
        String base64 = Base64.getEncoder().encodeToString(signBytes);
        System.out.println(base64);
        // 验证签名
        signature.initVerify(publicKey);
        signature.update(data.getBytes());
        boolean verify = signature.verify(Base64.getDecoder().decode(base64));
        System.out.println(verify);
    }
}