0716 ljc 加密类
This commit is contained in:
parent
ba1aec3975
commit
fccdf5c30c
@ -0,0 +1,104 @@
|
||||
|
||||
package cd.casic.ci.process.util;
|
||||
|
||||
import org.bouncycastle.jce.provider.BouncyCastleProvider;
|
||||
import org.bouncycastle.util.encoders.Hex;
|
||||
import org.springframework.security.crypto.bcrypt.BCrypt;
|
||||
|
||||
import javax.crypto.Cipher;
|
||||
import javax.crypto.spec.IvParameterSpec;
|
||||
import javax.crypto.spec.SecretKeySpec;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.security.Security;
|
||||
|
||||
/**
|
||||
* @author HopeLi
|
||||
* @version v1.0
|
||||
* @ClassName PwdUtil
|
||||
* @Date: 2025/7/16 16:06
|
||||
* @Description: 使用 Bouncy Castle 实现的 SM4 加密工具类(输出格式改为 Hex)
|
||||
*/
|
||||
public class PwdUtil {
|
||||
|
||||
static {
|
||||
Security.addProvider(new BouncyCastleProvider());
|
||||
}
|
||||
|
||||
public static final String key = "0123456789abcdeffedcba9876543210";
|
||||
public static final String IV = "fedcba98765432100123456789abcdef";
|
||||
|
||||
/**
|
||||
* 加密方法(CBC 模式)
|
||||
*
|
||||
* @param str 待加密数据
|
||||
* @return 加密后的密文(Hex 编码)
|
||||
*/
|
||||
public static String doEncrypt(String str) throws Exception {
|
||||
Cipher cipher = Cipher.getInstance("SM4/CBC/PKCS5Padding", "BC");
|
||||
SecretKeySpec keySpec = new SecretKeySpec(hexStringToBytes(key), "SM4");
|
||||
IvParameterSpec ivSpec = new IvParameterSpec(hexStringToBytes(IV));
|
||||
cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec);
|
||||
byte[] encrypted = cipher.doFinal(str.getBytes(StandardCharsets.UTF_8));
|
||||
return new String(Hex.encode(encrypted)); // 使用 Bouncy Castle 的 Hex 编码
|
||||
}
|
||||
|
||||
/**
|
||||
* 解密方法(CBC 模式)
|
||||
*
|
||||
* @param hexStr 密文(Hex 编码)
|
||||
* @return 解密后的明文
|
||||
*/
|
||||
public static String doDecrypt(String hexStr) throws Exception {
|
||||
Cipher cipher = Cipher.getInstance("SM4/CBC/PKCS5Padding", "BC");
|
||||
SecretKeySpec keySpec = new SecretKeySpec(hexStringToBytes(key), "SM4");
|
||||
IvParameterSpec ivSpec = new IvParameterSpec(hexStringToBytes(IV));
|
||||
cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);
|
||||
byte[] decrypted = cipher.doFinal(Hex.decode(hexStr)); // 使用 Bouncy Castle 的 Hex 解码
|
||||
return new String(decrypted, StandardCharsets.UTF_8);
|
||||
}
|
||||
|
||||
/**
|
||||
* 使用 BCrypt 对密码进行哈希加密
|
||||
*
|
||||
* @param password 明文密码
|
||||
* @return 加密后的 BCrypt Hash 字符串
|
||||
*/
|
||||
public static String bcEncrypt(String password) {
|
||||
return BCrypt.hashpw(password, BCrypt.gensalt());
|
||||
}
|
||||
|
||||
/**
|
||||
* 验证明文密码与 BCrypt 哈希是否匹配
|
||||
*
|
||||
* @param password 明文密码
|
||||
* @param hashed BCrypt 哈希字符串
|
||||
* @return 是否匹配
|
||||
*/
|
||||
public static boolean bcVerify(String password, String hashed) {
|
||||
return BCrypt.checkpw(password, hashed);
|
||||
}
|
||||
|
||||
/**
|
||||
* 十六进制字符串转字节数组
|
||||
*/
|
||||
private static byte[] hexStringToBytes(String hexString) {
|
||||
if (hexString == null || hexString.isEmpty()) {
|
||||
return new byte[0];
|
||||
}
|
||||
int len = hexString.length();
|
||||
byte[] data = new byte[len / 2];
|
||||
for (int i = 0; i < len; i += 2) {
|
||||
data[i / 2] = (byte) ((Character.digit(hexString.charAt(i), 16) << 4)
|
||||
+ Character.digit(hexString.charAt(i + 1), 16));
|
||||
}
|
||||
return data;
|
||||
}
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
if (bcVerify("123456","$2a$04$vwq0mgqk/fvBSnouekE6R.kKKYoXBimQhUwefbrSBRC6voSjGxidK")){
|
||||
System.out.println(true);
|
||||
}else {
|
||||
System.out.println(false);
|
||||
}
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user