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

注册时候使用 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破玩意~~

你可能感兴趣的:(加密,rsa)