ASP.NET MVC结合JavaScript登录、校验和加密

先说登录模块,因为涉及GET和POST请求,这些东西都是能被监控和抓取的所以就考虑这使用RSA加密解密方式传输用户名和密码参数,页面JS如下: 

```

/*需要引入三个JS文件,BigInt.js、RSA.js和Barrett.js,用到cookie则需要引入jquery.cookie.js文件*/

//与后台交互获取公钥

functiongetPublicKey() {

  varpubKey = '';

  if($.cookie('publicKey') == null) {

    $.ajax({

      url: "/Account/GetRsaPublicKey",

      type: "get",

      contentType: "application/x-www-form-urlencoded; charset=utf-8",

      async: false,

      data: {},

      dataType: "json",

      success: function(data) {

        if(data.Code == 0) {

          pubKey = data.RsaPublicKey + ","+ data.Key;

          $.cookie('publicKey', pubKey, { expires: 1 / 1440 });

        } else{

          Config.Method.JudgeCode(data, 1);

        }

      }

    });

  } else{

    pubKey = $.cookie('publicKey');

  }

  returnpubKey;

}

//公钥加密用户密码Pwd为RSA加密后参数

functionrsaEncrypt(pwd) {

  varpublicKey = getPublicKey();

  setMaxDigits(129);

  varrsaKey = newRSAKeyPair(publicKey.split(",")[0], "", publicKey.split(",")[1]);

  varpwdRtn = encryptedString(rsaKey, pwd);

  returnpwdRtn + ","+ publicKey.split(",")[2];

}

//POST登录请求,参数


  $(function() {

    $('#btnSubmit').live('click', function() {

      varuName = $('#u').val();

      varpwd = $('#p').val();

      if(uName == '') {

        alert('用户名不能为空');

        return;

      }

      if(pwd == '') {

        alert('用户密码不能为空');

        return;

      }

      varenPwd = rsaEncrypt(pwd);

      $.ajax({

        type: "POST",

        url: "/Account/UserLogin",

        data: { 'UserName': uName, 'Pwd': enPwd.split(",")[0], 'Key': enPwd.split(",")[1], 'RUrl': $('#hiddenUrl').val() },

        contentType: "application/x-www-form-urlencoded; charset=utf-8",

        async: false,

        dataType: "json",

        success: function(data) {

          if(data.result == true) {

            window.location.href = data.url;

            returnfalse;

          } else{

            $('#msg').text(data.message);

          }

        },

        error: function(XMLHttpRequest, textStatus, errorThrown) {

          $('#msg').text(XMLHttpRequest.status + '||'+ XMLHttpRequest.readyState + '||'+ textStatus);

        }

      });

    });

  })

```

前台加密完成后就需要后台做解密处理,解密完成后需要使用MD5加密现有密码与数据库中用户密码进行比较验证,如果验证通过则需要写入cookie以便下次用户能自  

动登录,由于cookie中我不希望用户名和密码都明码存储,我这里用到了AES加密的方式,自定义一个32位的加密密钥对cookie进行加密解密处理,后台c#代码如 下: 

[HttpPost]

    publicJsonResult UserLogin(stringUserName, stringPwd, stringKey, stringRUrl)

    {

      stringprivateKey = Common.CacheGet(Key) asstring;

      if(!string.IsNullOrEmpty(privateKey))

      {

        if(string.IsNullOrEmpty(UserName))

        {

          returnJson(new{ result = false, message = "用户名为空"}, JsonRequestBehavior.AllowGet);

        }

        if(string.IsNullOrEmpty(Pwd))

        {

          returnJson(new{ result = false, message = "用户密码为空"}, JsonRequestBehavior.AllowGet);

        }

        stringpwd = Common.DecryptRSA(Pwd, privateKey);//私钥解密

        stringmd5Pwd = Common.NoneEncrypt(Common.NoneEncrypt(Common.NoneEncrypt(pwd, 1), 1), 1);//将解密后的值md5加密3次

        AccountUnserInfo userInfo = bll.GetUserInfo(UserName.Trim(), md5Pwd);

        if(userInfo != null&& userInfo.U_Id > 0)//用户信息存在

        {

          //用户名、密码放入cookie

          HttpCookie cookie = newHttpCookie("fw_izz");

          //AES加密Cookie

          cookie["u_name"] = AesEncryptHelper.EncryptAes(UserName);

          cookie["u_pwd"] = AesEncryptHelper.EncryptAes(pwd);

          cookie.Expires = DateTime.Now.AddDays(7);

          Response.Cookies.Add(cookie);

          if(!string.IsNullOrEmpty(RUrl))//接收隐藏域中的值

          {

            returnJson(new{ result = true, message = "成功", url = RUrl });

          }

          else

          {

            returnJson(new{ result = true, message = "成功", url = "/AccountDetail/Index"});

          }

        }

        else

        {

          returnJson(new{ result = false, message = "用户信息不存在", url = "/Account/Index"});

        }

      }

      else

      {

        returnJson(new{ result = false, message = "非法秘钥", url = "/Account/Index"});

      }

    }

各种加密解密方法、Cache操作以及cookie操作代码如下:  


public class Common

  {

    ///

    /// 产生一组RSA公钥、私钥

    ///

    ///

    publicstaticDictionary CreateRsaKeyPair()

    {

      var keyPair = newDictionary();

      var rsaProvider = newRSACryptoServiceProvider(1024);

      RSAParameters parameter = rsaProvider.ExportParameters(true);

      keyPair.Add("PUBLIC", BytesToHexString(parameter.Exponent) + ","+ BytesToHexString(parameter.Modulus));

      keyPair.Add("PRIVATE", rsaProvider.ToXmlString(true));

      returnkeyPair;

    }


    ///

    /// RSA解密字符串

    ///

    /// 密文

    /// 私钥

    /// 明文

    publicstaticstringDecryptRSA(stringencryptData, stringprivateKey)

    {

      stringdecryptData = "";

      try

      {

        var provider = newRSACryptoServiceProvider();

        provider.FromXmlString(privateKey);


        byte[] result = provider.Decrypt(HexStringToBytes(encryptData), false);

        ASCIIEncoding enc = newASCIIEncoding();

        decryptData = enc.GetString(result);

      }

      catch(Exception e)

      {

        thrownewException("RSA解密出错!", e);

      }

      returndecryptData;

    }


    privatestaticstringBytesToHexString(byte[] input)

    {

      StringBuilder hexString = newStringBuilder(64);


      for(inti = 0; i < input.Length; i++)

      {

        hexString.Append(String.Format("{0:X2}", input[i]));

      }

      returnhexString.ToString();

    }


    publicstaticbyte[] HexStringToBytes(stringhex)

    {

      if(hex.Length == 0)

      {

        returnnewbyte[] { 0 };

      }

      if(hex.Length % 2 == 1)

      {

        hex = "0"+ hex;

      }

      byte[] result = newbyte[hex.Length / 2];

      for(inti = 0; i < hex.Length / 2; i++)

      {

        result[i] = byte.Parse(hex.Substring(2 * i, 2), System.Globalization.NumberStyles.AllowHexSpecifier);

      }

      returnresult;

    }


    privatestaticObjectCache Cache

    {

      get{ returnMemoryCache.Default; }

    }

    ///

    /// 获取缓存

    ///

    ///

    ///

    publicstaticobjectCacheGet(stringkey)

    {

      returnCache[key];

    }

    ///

    /// 设置缓存

    ///

    ///

    ///

    ///

    publicstaticvoidCacheSet(stringkey, objectdata, intcacheTime)

    {

      CacheItemPolicy policy = newCacheItemPolicy();

      policy.AbsoluteExpiration = DateTime.Now + TimeSpan.FromMinutes(cacheTime);

      Cache.Add(newCacheItem(key, data), policy);

    }

    ///

    /// 判断缓存是否存在

    ///

    ///

    ///

    publicstaticboolIsSet(stringkey)

    {

      return(Cache[key] != null);

    }

    ///

    /// 缓存失效

    ///

    ///

    publicstaticvoidCacheRemove(stringkey)

    {

      Cache.Remove(key);

    }

    ///

    /// 对字符串进行加密(不可逆)

    ///

    /// 要加密的字符串

    /// 加密方式,0 is SHA1,1 is MD5

    ///

    publicstaticstringNoneEncrypt(stringPassword, intFormat)

    {

      stringstrResult = "";

      switch(Format)

      {

        case0:

          strResult = FormsAuthentication.HashPasswordForStoringInConfigFile(Password, "SHA1");

          break;

        case1:

          strResult = FormsAuthentication.HashPasswordForStoringInConfigFile(Password, "MD5");

          break;

        default:

          strResult = Password;

          break;

      }

      returnstrResult;

    }

  }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容

  • /**ios常见的几种加密方法: 普通的加密方法是讲密码进行加密后保存到用户偏好设置( [NSUserDefaul...
    彬至睢阳阅读 2,906评论 0 7
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,580评论 18 139
  • 刚回家
    竹滴清音阅读 187评论 0 0
  • 作者:echo 我第一次被请到镇上一个极有钱的沙哈拉威财主家去吃饭时,并不认识那家的主人。 据这个财主堂兄太太的弟...
    槿林阅读 978评论 0 1
  • Hich99en阅读 205评论 0 0