前端通过rsa的私钥进行签名
import CryptoJS from "crypto-js";
import {JSEncrypt} from "jsencrypt";
// 哈希函数
function sha256(data) {
const hash = CryptoJS.SHA256(data);
return CryptoJS.enc.Hex.parse(hash.toString(CryptoJS.enc.Hex));
}
function signWithPrivateKey(privateKey, password) {
const encrypt = new JSEncrypt();
encrypt.setPrivateKey(privateKey);
const hash = sha256(password);
const signature = encrypt.sign(hash, function (data) {
return CryptoJS.SHA256(data).toString(CryptoJS.enc.Hex);
}, "sha256");
console.log("Signature:", signature, "Hash:", hash.toString(CryptoJS.enc.Hex));
return signature;
}
function privateKeyString(password) {
const privateKeyUrl = 'privateKey.pem';
// 返回一个 Promise
return fetch(privateKeyUrl)
.then(response => response.text())
.then(privateKeyString => {
const signature = signWithPrivateKey(privateKeyString, password);
// 现在,signature 包含了 Base64 编码的签名字符串,您可以将其发送到服务器端进行验证
return signature
})
.catch(error => console.error(error));
}
后端调用公钥方法进行rsa签名认证
// 处理签名和密码的数据
byte[] receivedSignature = Base64.getDecoder().decode(signature);
boolean isSignatureValid = RSAUtils.verifySignature(password, receivedSignature, RSAUtils.publicKey);
// 调用公钥签名进行校验
/**
* 验证签名
* @param originalData 原始数据
* @param receivedSignature 接收到的签名
* @param publicKey 公钥
* @return 验证结果,成功返回 true,失败返回 false
*/
public static boolean verifySignature(String originalData, byte[] receivedSignature, PublicKey publicKey) {
try {
MessageDigest messageDigest = MessageDigest.getInstance("SHA-256");
byte[] hash = messageDigest.digest(originalData.getBytes(StandardCharsets.UTF_8));
Signature signature = Signature.getInstance("SHA256withRSA");
signature.initVerify(publicKey);
signature.update(hash); // 使用哈希值进行验证
boolean verified = signature.verify(receivedSignature);
return verified;
} catch (NoSuchAlgorithmException | InvalidKeyException | SignatureException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}