RSA与jsrsasign和C#签约

时间:2016-12-13 16:50:02

标签: javascript asp.net-mvc rsa

我正在尝试使用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中采用了Hex转换方法 现在我有一个前端的POC实现jsrsasign。

<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站点生成的签名是不同的。
每个签名/验证往返都适用于这两种技术 我一直在玩编码和一堆东西,但我不能让它工作。所以我的问题是:如何让这个场景正常工作?

1 个答案:

答案 0 :(得分:0)

我怀疑这是一个编码问题。在想了几个小时之后我终于让它工作了Encoding.Unicode

替换Encoding.UTF8