我是靠谱客的博主 欢喜指甲油,最近开发中收集的这篇文章主要介绍RSA 签名认证,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

开发中遇到某个模块的表单需要发布给匿名用户填写,想到了RSA签名对URL进行签名处理来做,代码很多,贴上的是符合自己开发的,需要注意的是Convert.FromBase64String这个函数的传参,用PrivateKey对发布的URL参数Content进行签名,再用PublicKey验证签名,需要注意对PublicKey和PrivateKey的理解。

首先生成PrivateKey和PublicKey,代码如下:

/// <summary>
/// RSA产生密钥
/// </summary>
/// <param name="xmlKeys">私钥</param>
/// <param name="xmlPublicKey">公钥</param>
public void RSAKey(out string xmlKeys, out string xmlPublicKey)
{
try
{
System.Security.Cryptography.RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
xmlKeys = rsa.ToXmlString(true);
xmlPublicKey = rsa.ToXmlString(false);
}
catch (Exception ex)
{
throw ex;
}
}

签名代码如下:

 #region RSA 签名验证
/// <summary>
/// RSA签名
/// </summary>
/// <param name="privateKey">私钥</param>
/// <param name="content">需签名的数据</param>
/// <returns>签名后的值</returns>
public static string SignatureFormatter(string privateKey, string content) {
var hashData = GetHash(content);
RSACryptoServiceProvider key = new RSACryptoServiceProvider();
key.FromXmlString(privateKey);
RSAPKCS1SignatureFormatter formatter = new RSAPKCS1SignatureFormatter(key);
formatter.SetHashAlgorithm("SHA1");
byte[] inArray = formatter.CreateSignature(hashData);
return Convert.ToBase64String(inArray).Replace("/", "_");
}
/// <summary>
/// RSA验证
/// </summary>
/// <param name="publicKey">公钥</param>
/// <param name="hashData">Hash描述</param>
/// <param name="signature">签名后的结果</param>
/// <returns></returns>
public static bool ValidateSignature(string publicKey, byte[] hashData, string signature) {
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
rsa.FromXmlString(publicKey);
RSAPKCS1SignatureDeformatter rsaDeformatter = new RSAPKCS1SignatureDeformatter(rsa);
rsaDeformatter.SetHashAlgorithm("SHA1");
var deformatterData = Convert.FromBase64String(signature);
return rsaDeformatter.VerifySignature(hashData, deformatterData);
}
/// <summary>
/// Hash算法
/// </summary>
/// <param name="content"></param>
/// <returns></returns>
public static byte[] GetHash(string content) {
var buffer = Encoding.GetEncoding("UTF-8").GetBytes(content);
var sha = HashAlgorithm.Create("SHA1");
return sha?.ComputeHash(buffer);
}
#endregion

最后在请求表单时做认证

/// <summary>
/// 获取专项信息
/// </summary>
/// <param name="detailId"></param>
/// <param name="signCode"></param>
/// <returns></returns>
[Route("get-zxjc-task/{detailId}/{signCode}"), HttpGet, AllowAnonymous]
public ApiResultModel<SaveZxjcDetailModel> GetZxjcTaskModel(string detailId, string signCode) {
var hashStr = _zxjcRecordProvider.GetHashStr(detailId);
var hashData = RsaCryption.GetHash(hashStr);
if (RsaCryption.ValidateSignature(publicKey, hashData, signCode.Replace("_", "/"))) {
var result = _zxjcRecordProvider.GetZxjcTaskModel(detailId);
return this.Success(result);
}
else
return new ApiResultModel<SaveZxjcDetailModel>();
}

 

转载于:https://www.cnblogs.com/ArsenalArsig/p/9098459.html

最后

以上就是欢喜指甲油为你收集整理的RSA 签名认证的全部内容,希望文章能够帮你解决RSA 签名认证所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(63)

评论列表共有 0 条评论

立即
投稿
返回
顶部