使用 jsrsasign 和 C# 进行 RSA 签名
RSA signing with jsrsasign and C#
我正在尝试使用 RSA 实施许可系统。
原理很简单:后端使用证书的私钥生成并签署许可证,前端使用提供的签名验证许可证以确保许可证的完整性和来源。
后端是一个 asp.net mvc(经典,非核心)网站。前端 javascript/typescript 利用 jsrsasign 库。
这是我的签名方法(后端):
var binarySerializedLicense = Encoding.Unicode.GetBytes(serializedLicense);
var rsaEncryptor = (RSACryptoServiceProvider)_signingCertificate.PrivateKey;
var signatureData = rsaEncryptor.SignData(binarySerializedLicense, new SHA1CryptoServiceProvider());
var signature = ByteArrayToString(signatureData);
这是我的验证方法(后端):
var signatureData = StringToByteArray(signature);
var licenseData = Encoding.Unicode.GetBytes(serializedLicense);
var rsaEncryptor = (RSACryptoServiceProvider)_signingCertificate.PrivateKey;
var isLicenseValid = rsaEncryptor.VerifyData(licenseData, new SHA1CryptoServiceProvider(), signatureData);
我采用了 this post
中的十六进制转换方法
现在我有了 jsrsasign 的前端 POC 实现。
<script type="text/javascript">
function verifyData() {
var pem = "-----BEGIN PUBLIC KEY-----\
...\
im7MVM73FyE6BFb2cv3IZWUCAwEAAQ==\
-----END PUBLIC KEY-----";
var sig = new KJUR.crypto.Signature({ "alg": "SHA1withRSA" });
sig.init(pem);
sig.updateString($("#data").val());
var isValid = sig.verify($("#signature").val());
alert(isValid);
}
function signData() {
var pem = "-----BEGIN PRIVATE KEY-----\
...\
-----END PRIVATE KEY-----";
var sig = new KJUR.crypto.Signature({ "alg": "SHA1withRSA" });
sig.init(pem);
sig.updateString($("#data").val());
$("#signature").val(sig.sign());
}
$(function () {
$("#verify").click(function () {
verifyData();
});
$("#sign").click(function () {
signData();
});
});
</script>
Signature <input type='text' id='signature' /><br />
Data <input type='text' id='data' /><br />
<button id="verify">Verify</button>
<button id="sign">Sign</button>
我遇到的问题是 jsrsasign 生成的签名和 asp.net mvc 站点生成的签名不同。
每个 sign/verify 往返都适用于这两种技术。
我一直在玩编码和一堆东西,但我无法让它工作。所以我的问题是:我怎样才能让这个场景正常工作?
我怀疑这是一个编码问题。在想了几个小时后,我终于让它工作了,用 Encoding.UTF8
替换 Encoding.Unicode
我正在尝试使用 RSA 实施许可系统。
原理很简单:后端使用证书的私钥生成并签署许可证,前端使用提供的签名验证许可证以确保许可证的完整性和来源。
后端是一个 asp.net mvc(经典,非核心)网站。前端 javascript/typescript 利用 jsrsasign 库。
这是我的签名方法(后端):
var binarySerializedLicense = Encoding.Unicode.GetBytes(serializedLicense);
var rsaEncryptor = (RSACryptoServiceProvider)_signingCertificate.PrivateKey;
var signatureData = rsaEncryptor.SignData(binarySerializedLicense, new SHA1CryptoServiceProvider());
var signature = ByteArrayToString(signatureData);
这是我的验证方法(后端):
var signatureData = StringToByteArray(signature);
var licenseData = Encoding.Unicode.GetBytes(serializedLicense);
var rsaEncryptor = (RSACryptoServiceProvider)_signingCertificate.PrivateKey;
var isLicenseValid = rsaEncryptor.VerifyData(licenseData, new SHA1CryptoServiceProvider(), signatureData);
我采用了 this post
中的十六进制转换方法
现在我有了 jsrsasign 的前端 POC 实现。
<script type="text/javascript">
function verifyData() {
var pem = "-----BEGIN PUBLIC KEY-----\
...\
im7MVM73FyE6BFb2cv3IZWUCAwEAAQ==\
-----END PUBLIC KEY-----";
var sig = new KJUR.crypto.Signature({ "alg": "SHA1withRSA" });
sig.init(pem);
sig.updateString($("#data").val());
var isValid = sig.verify($("#signature").val());
alert(isValid);
}
function signData() {
var pem = "-----BEGIN PRIVATE KEY-----\
...\
-----END PRIVATE KEY-----";
var sig = new KJUR.crypto.Signature({ "alg": "SHA1withRSA" });
sig.init(pem);
sig.updateString($("#data").val());
$("#signature").val(sig.sign());
}
$(function () {
$("#verify").click(function () {
verifyData();
});
$("#sign").click(function () {
signData();
});
});
</script>
Signature <input type='text' id='signature' /><br />
Data <input type='text' id='data' /><br />
<button id="verify">Verify</button>
<button id="sign">Sign</button>
我遇到的问题是 jsrsasign 生成的签名和 asp.net mvc 站点生成的签名不同。
每个 sign/verify 往返都适用于这两种技术。
我一直在玩编码和一堆东西,但我无法让它工作。所以我的问题是:我怎样才能让这个场景正常工作?
我怀疑这是一个编码问题。在想了几个小时后,我终于让它工作了,用 Encoding.UTF8
Encoding.Unicode