HTML5技术

c#与JavaScript实现对用户名、密码进行RSA非对称加密 - 彩色铅笔

字号+ 作者:H5之家 来源:博客园 2015-10-22 11:20 我要评论( )

博主最近手上这个项目呢(就是有上百个万恶的复杂excel需要解析的那个项目,参见博客:),由于是一个内网项目,安全性要求很低,不需要做什么报文加密。 但是总觉得用户名密码都是明文传输,略微有点坑甲方... 想了想,那就做个RSA加密,把用户名、密码做密

博主最近手上这个项目呢(就是有上百个万恶的复杂excel需要解析的那个项目,参见博客:),由于是一个内网项目,安全性要求很低,不需要做什么报文加密。

但是总觉得用户名密码都是明文传输,略微有点坑甲方...

想了想,那就做个RSA加密,把用户名、密码做密文传输吧...至于为什么是RSA,因为也想趁机学习一下,DES、MD5什么的以前都做过了,不想又复制粘贴敷衍了事,怎么说领导还给了3天时间呢...

咱可是有原则的程序员。

 

首先要感谢博客园一些前辈们相关的一些文章,让博主一个只知道RSA基本概念的人在很短的时间内就成功实现了JS进行加密,C#进行解密的一个过程。

大概看了10来篇文章,感觉差不多了才开始写的自己的代码...
很难再具体回忆到从哪一篇文章获益最大,只能在此统一表示感谢!

 

写代码之前大概整理出一个整体流程:

0.后台实现两个基础方法:

(1)CreateRsaKeyPair()方法,产生一对RSA私钥公钥,并配以唯一的键值key

(2)DecryptRSA()方法,对密文进行RSA解密

1.用户访问客户端,客户端向服务器请求获取一个RSA公钥以及键值key,存储在本地

2.用户在本地公钥失效前发起登录请求,则使用已有公钥对用户密码进行加密;若已过期则执行1后再加密

3.客户端将密文与key一起传回后台

4.后台通过key找到缓存里面的私钥,对密文进行解密

 

OK,我们先来看看c#对应的两个基础方法

产生一组RSA公钥、私钥 Dictionary<string, string> CreateRsaKeyPair() 6 { 7 var keyPair = new Dictionary<string, string>(); 8 var rsaProvider = new RSACryptoServiceProvider(1024); 9 RSAParameters parameter = rsaProvider.ExportParameters(true); , BytesToHexString(parameter.Exponent) + + BytesToHexString(parameter.Modulus)); , rsaProvider.ToXmlString(true)); 12 return keyPair; 13 } RSA解密字符串 DecryptRSA(string encryptData, string privateKey) 22 { 23 string decryptData = ""; { 26 var provider = new RSACryptoServiceProvider(); 27 provider.FromXmlString(privateKey); [] result = provider.Decrypt(HexStringToBytes(encryptData), false); 30 ASCIIEncoding enc = new ASCIIEncoding(); 31 decryptData = enc.GetString(result); 32 } 33 catch (Exception e) 34 { Exception(, e); 36 } 37 return decryptData; 38 } BytesToHexString(byte[] input) 41 { 42 StringBuilder hexString = new StringBuilder(64); (int i = 0; i < input.Length; i++) 45 { , input[i])); 47 } 48 return hexString.ToString(); 49 } [] HexStringToBytes(string hex) 52 { 53 if (hex.Length == 0) 54 { [] { 0 }; 56 } (hex.Length % 2 == 1) 59 { + hex; 61 } [] result = new byte[hex.Length / 2]; (int i = 0; i < hex.Length / 2; i++) 66 { 67 result[i] = byte.Parse(hex.Substring(2 * i, 2), System.Globalization.NumberStyles.AllowHexSpecifier); 68 } result; 71 }

注:

两个私有方法是进行16进制的转换,因为js前端rsa加密时要求的参数需要是16进制字符串。

其实博主认为比较好的方法是:后台不做转换,直接提供与接收普通字符串,由客户端按自身需要自己做类型转换。

博主这儿客户端就是一个web网站,正好后台以前又有这么两个转换方法,故在后台做了16进制转换。

下面贴出不做转换产生公钥私钥的代码(替换第10/11行代码):

, rsaProvider.ToXmlString(false)); , rsaProvider.ToXmlString(true));

 

我们还需要一个独立的获取RSA公钥的接口:

获取RSA公钥 [Route()] 6 [HttpGet] 7 [Anonymous] 8 public GetRsaPublicKeyResult GetRsaPublicKey() 9 { 10 var rsaKeys = Security.CreateRsaKeyPair(); key = Guid.NewGuid().ToString(); CacheDataManager.DataInsert(key, rsaKeys[], DateTime.Now.AddMinutes(10)); GetRsaPublicKeyResult() 17 { 18 Code = 0, ], 20 Key= key 21 }; 22 }

 

那么我们的登录接口就该做成这样:

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • HTML5 进阶系列:拖放 API 实现拖放排序 - _林鑫

    HTML5 进阶系列:拖放 API 实现拖放排序 - _林鑫

    2017-05-02 11:02

  • 调取百度地图接口,实现取自己的实时位置,然后可以在百度地图上添加信息标注 - QISHUANG

    调取百度地图接口,实现取自己的实时位置,然后可以在百度地图上添加

    2017-04-18 10:02

  • 计算机网络——DNS协议的学习与实现 - 学数学的程序猿

    计算机网络——DNS协议的学习与实现 - 学数学的程序猿

    2017-04-16 10:00

  • 前端实现搜索记录功能也就是天猫app历史记录存储方便浏览 - 今天的代码你撸了嘛

    前端实现搜索记录功能也就是天猫app历史记录存储方便浏览 - 今天的代

    2017-04-12 14:00

网友点评
>