注册时候使用 RSA 实现前台对密码加密和后台解密

来源:互联网 发布:织梦源码安装方法 编辑:程序博客网 时间:2024/05/28 15:07

注册时候使用 RSA 实现前台对密码加密和后台解密

原理这里就不分析了,直接干货奉上。orchard中写的一个moudle,也就是C# mvc代码。


前台加密部分

首先项目中引用三个 js 文件


  • rsa.js
  • Barrett.js
  • BigInt.js

前台header上加入js代码
 function RSAPassAndSubmit(passTxtBox, confirmPassTxtBox, exponent, modulus) {        setMaxDigits(130);        var key = new RSAKeyPair(exponent, "", modulus);        passTxtBox.value = encryptedString(key, passTxtBox.value);        confirmPassTxtBox.value = encryptedString(key, confirmPassTxtBox.value);        }

注册的button上加入事件

<button class="primaryAction btn btn-default" type="submit" id="btnRegister" onsubmit="javascript:return validatePlus();" onclick="@string.Format("javascript:RSAPassAndSubmit(Password,ConfirmPassword,'{0}','{1}');", ViewData["Exponent"],                 ViewData["Modulus"])" > @T("註冊")</button>

关于ViewData[“Exponent”],ViewData[“Modulus”]),这两个参数是后台传过来的

后台代码

对前台加密传过来的密码进行解密了

当然首先前台还需要的东西 加密键值对 要给他传过去。

private const string RsaKeyname = "RSAKeyPair";//第一次执行的时候调用,当然在执行post的时候,比如注册不成功,我们还需要在调用InitialRsaViewData()方法 初始化返回view().public ActionResult Register()        {              InitialRsaViewData();            return View();        }/// <summary>/// Create Exponent and Modulus For RSA Encrypt Password /// </summary>private void InitialRsaViewData()        {            var rsa = new RSACryptoServiceProvider(1024);            RSAParameters para = rsa.ExportParameters(true);            ViewData["Exponent"] = _userAcountService.BytesToHex(para.Exponent);            ViewData["Modulus"] = _userAcountService.BytesToHex(para.Modulus);            Session[RsaKeyname] = para;        }

上面的还有两个方法BytesToHex(),BytesToHex()是写在serivice中的,可以拿出来:

 public string BytesToHex(byte[] input)        {            StringBuilder hexString = new StringBuilder(64);            for (int i = 0; i < input.Length; i++)            {                hexString.Append(String.Format("{0:X2}", input[i]));            }            return hexString.ToString();        }   public byte[] HexToBytes(string hex)        {            if (hex.Length == 0)            {                return new byte[] { 0 };            }            if (hex.Length % 2 == 1)            {                hex = "0" + hex;            }            byte[] result = new byte[hex.Length / 2];            for (int i = 0; i < hex.Length / 2; i++)            {                result[i] = byte.Parse(hex.Substring(2 * i, 2), System.Globalization.NumberStyles.AllowHexSpecifier);            }            return result;        }

然后就是解密方法了,需要对密码操作的地方调用一下

 /// <summary> /// The password to decrypt /// </summary> /// <param name="s"></param> /// <returns></returns> private string RsaDecrypt(string s)        {            var rsa = new RSACryptoServiceProvider();            rsa.ImportParameters((RSAParameters)Session[RsaKeyname]);            string strPassword = System.Text.Encoding.ASCII.GetString(rsa.Decrypt(_userAcountService.HexToBytes(s), false));            return strPassword;        }

[toc]
再说说遇到的一些问题吧,在chrome中运行程序的时候,我一开始把解密方法没封装成函数,直接写,也就是同时解密password和confirmPassword,出现不正确的数据什么的bug。不管他,但是单一的解密又是可以的,后来把chrome的缓存关了,就好了。乱七八糟的bug,orchad破玩意~~

0 0
原创粉丝点击