https://www.cnblogs.com/VectorZhang/p/5425283.html

保存登录信息的Cookie加密技术
所有需要账户登录的website 基本都会想到这样一个问题, 如何保持用户在一定时间内登录有效。最近本人就在项目中遇到这样的需求,某些页面只能Admin账户登录后访问, 当登录Admin账户后如何才能保持登录信息呢?用Cookie或者Session来保存登录信息已经是一种比较成熟的技术。但是对于账户信息如果把明文放在Cookie里面显然是非常危险的。今天给大家分享一下自己在项目中用到的一些加密解密技术。Cookie 是以key-value的形式存数据。对于账户信息而言最简单的是 UserName 和 Password如果以明文的形式放到Cookie 比如UserName=fakeUserPassword=fakePsd考虑到安全性的问题,显然没有任何website会这样做。那么是否可以把这几个字段都加密呢?对 Key 的加密
对key字段像UserName, Password只需要在Server端加密并保存即可,甚至都无需还原成明文。复制代码
public static string MD5Hash(stringinput){byte[] data = Encoding.UTF8.GetBytes(input.Trim().ToLowerInvariant());using (var md5 = new MD5CryptoServiceProvider()){data = md5.ComputeHash(data);}var ret = new StringBuilder();foreach (byte b in data){ret.Append(b.ToString("x2").ToLowerInvariant());}return ret.ToString();}
复制代码
例如计算出UserName 和 Password的 MD5 hash 值,Cookie形式就可以表示成ee11cbb19052e40b07aac0ca060c23ee=fakeUser5f4dcc3b5aa765d61d8327deb882cf99=fakePsd相比没有加密前安全性是不是高了那么一点点,但这肯定还是不够。我们最终的目标是对所有字段加密。对Value的加密
对value字段加密就不能是单向的,试想一下如果在Server端对用户名加密放到Cookie再传到Client端, 看起来OK. 当Client端的cookie再传回Server端时,如果不能解密Encode后的用户名那么Cookie就等于失效了。一个非常简单的算法就是用过异或来实现加密解密,比如提供一个秘钥 X,encode_data = data ^ Xdecode_data = encode_data ^ X则 data == decode_data.目前 .NET 提供不了不少对称加密算法都直接以dll 的形式给出了。.NET 中提供的对称加密算法都继承基类SymmetricAlgorithmimage具体代码可以直接调用他们的子类像TripleDESCryptoServiceProviderRijndaelManagedMSDN 上已经提供了的代码案例,这里就不再给出Test Sample.为了能够灵活的运用到项目中本人就封装了一些接口复制代码// 定义加密解密的接口public interface IEncryptionProvider{byte[] Key { get; }byte[] IV { get; }Encoding Encoding { get; }string Encrypt(string data);string Decrypt(string encodeData);}
复制代码复制代码//加密解密抽象基类public abstract class BaseEncryptionProvider : IEncryptionProvider{protected byte[] _keyBytes;protected byte[] _IVBytes;public byte[] Key{get{if (this._keyBytes == null){this.GenerateKeyIV();}return this._keyBytes;}}public byte[] IV{get{if (this._IVBytes == null){this.GenerateKeyIV();}return this._IVBytes;}}private Encoding _encoding;public Encoding Encoding{get { return this._encoding ?? Encoding.UTF8; }set { this._encoding = value; }}public string Encrypt(string data){if (string.IsNullOrEmpty(data)){throw new ArgumentNullException("data");}byte[] bytes = this.Encoding.GetBytes(data);var encodedBytes = this.EncryptImpl(bytes);return this.PostEncrypt(encodedBytes);}public string Decrypt(string encodeData){if (string.IsNullOrEmpty(encodeData)){throw new ArgumentNullException("encodeData");}var bytes = this.PreDecrypt(encodeData);var decodeBytes = this.DecryptImpl(bytes);return this.Encoding.GetString(decodeBytes);}//加密算法的实现函数protected abstract byte[] EncryptImpl(byte[] bytes);//解密算法的实现函数protected abstract byte[] DecryptImpl(byte[] bytes);public virtual string PostEncrypt(byte[] bytes){return System.Convert.ToBase64String(bytes);}public virtual byte[] PreDecrypt(string input){return System.Convert.FromBase64String(input);}public abstract void GenerateKeyIV();}
复制代码复制代码//异或加密算法类   public class EOREncryptionProvider : BaseEncryptionProvider{private string _key;public EOREncryptionProvider(string key){if (string.IsNullOrEmpty(key)){throw new ArgumentNullException("key");}this._key = key;}public override void GenerateKeyIV(){this._keyBytes = this.Encoding.GetBytes(this._key);this._IVBytes = this.Encoding.GetBytes(this._key);}//考虑到秘钥长度以及数据长度等因素 具体实现算法多种多样protected override byte[] EncryptImpl(byte[] dataBytes){int dataLength = dataBytes.Length;int keyLength = this.Key.Length;for (var i = 0; i < dataLength; i++){if (i < keyLength){dataBytes[i] ^= this.Key[i];}else{dataBytes[i] ^= this.Key[keyLength - 1];}}return dataBytes;}protected override byte[] DecryptImpl(byte[] dataBytes){int dataLength = dataBytes.Length;int IVLength = this.IV.Length;for (var i = 0; i < dataLength; i++){if (i < IVLength){dataBytes[i] ^= this.IV[i];}else{dataBytes[i] ^= this.IV[IVLength - 1];}}return dataBytes;}}
复制代码复制代码// .Net 内置加密算法的封装public class SymmetricAlgoEncryptionProvider : BaseEncryptionProvider{private SymmetricAlgorithm _symmetricAlgorithm;public SymmetricAlgoEncryptionProvider(SymmetricAlgorithm providerImpl){if (providerImpl == null){throw new ArgumentNullException("providerImpl");}this._symmetricAlgorithm = providerImpl;this._symmetricAlgorithm.Padding = PaddingMode.ISO10126;}protected override byte[] EncryptImpl(byte[] bytes){byte[] encryptedData;using (var input = new MemoryStream(bytes))using (var output = new MemoryStream()){var encryptor = this._symmetricAlgorithm.CreateEncryptor(this.Key, this.IV);using (var cryptStream = new CryptoStream(output, encryptor, CryptoStreamMode.Write)){var buffer = new byte[1024];var read = input.Read(buffer, 0, buffer.Length);while (read > 0){cryptStream.Write(buffer, 0, read);read = input.Read(buffer, 0, buffer.Length);}cryptStream.FlushFinalBlock();encryptedData = output.ToArray();}}return encryptedData;}protected override byte[] DecryptImpl(byte[] bytes){byte[] result;using (var input = new MemoryStream(bytes))using (var output = new MemoryStream()){var decryptor = this._symmetricAlgorithm.CreateDecryptor(this.Key, this.IV);using (var cryptStream = new CryptoStream(input, decryptor, CryptoStreamMode.Read)){var buffer = new byte[1024];var read = cryptStream.Read(buffer, 0, buffer.Length);while (read > 0){output.Write(buffer, 0, read);read = cryptStream.Read(buffer, 0, buffer.Length);}cryptStream.Flush();result = output.ToArray();}}return result;}public override void GenerateKeyIV(){this._symmetricAlgorithm.GenerateKey();this._symmetricAlgorithm.GenerateIV();this._keyBytes = this._symmetricAlgorithm.Key;this._IVBytes = this._symmetricAlgorithm.IV;}}
复制代码
最后可以这样调用复制代码static void Main(string[] args){IEncryptionProvider provider = new EOREncryptionProvider("this is the key");string data = "fakeUser";string encodeData = provider.Encrypt(data);Console.WriteLine("encodeData:{0}", encodeData);string decodeData = provider.Decrypt(encodeData);Console.WriteLine("decodeData:{0}", decodeData);provider = new SymmetricAlgoEncryptionProvider(new TripleDESCryptoServiceProvider());encodeData = provider.Encrypt(data);Console.WriteLine("encodeData:{0}", encodeData);decodeData = provider.Decrypt(encodeData);Console.WriteLine("decodeData:{0}", decodeData);}
复制代码

保存登录信息的Cookie加密技术相关推荐

  1. 关于Webview如何自动登录保存登录信息

    [Android实例] 关于Webview如何自动登录保存登录信息 用户名密码登录验证后保存Session // 你的URLHttpPost httppost = new HttpPost(Const ...

  2. python 登陆淘宝_如何用 Python 自动登录淘宝并保存登录信息?

    原标题:如何用 Python 自动登录淘宝并保存登录信息? 作者 | 猪哥 责编 | 伍杏玲 前段时间时间为大家讲解了如何使用requests库模拟登录淘宝,而今天我们将对该功能进行丰富.所以我们把之 ...

  3. [数据加密]GIS空间数据水印信息隐藏与加密技术方法[转]

    到目前为止,国内外数字水印技术的研究主要集中在图像.视频和声音等多媒体信息的版权保护上,在GIS空间数据中,通过隐藏水印信息并对其加密.压缩以实现其安全保护的研究还很少,这是数字水印技术应用的一个新领 ...

  4. Android:Day03_完美登录案例(使用流和文件来保存登录信息)

    Day03_完美登录案例 目录 Day03_完美登录案例 一.项目目录结构 二.类和文档(按项目目录结构排序) 1.类:LoginSace 2.类:MainActivity 3.AndroidMani ...

  5. php手机短信验证码用cookie存好还是session存好,保存登录信息的时候用session好还是cookie好?...

    其实这个问题本身不是很准确,我觉得可能对浏览器机制和http协议做更多了解,可能更好点.为什么? 首先直接回答问题,一般比较方案是从功能,安全,效率三方面看,功能上都能达到要求,那么从安全和效率两方面 ...

  6. Java Web —— Session 和 cookie 保存登录信息

    session 与 cookie cookie 与 session 应用于互联网中的一项基本技术--会话(客户端与服务端的交互)跟踪技术,用来跟踪用户的整个会话.简单来说,cookie 是通过在客户端 ...

  7. webview如何自动登录保存登录信息详情

    在Linux下,Android模拟器里使用SD卡 http://www.eoeandroid.com/thread-201250-1-1.html 关于GridView布局和界面的跳转 http:// ...

  8. java保存登录信息_java – 保存登录详细信息(首选项)android

    我有一个具有登录,注销功能的Android应用程序.登录表单包含用户名和密码以及登录按钮.我想在用户选中"记住我"复选框时保存用户名和密码. 我的project.java文件如下所 ...

  9. 微信公众号外部登录与授权,保存登录信息问题记录

    场景: 公众号打开从第三方页面进行登录,登录成功跳转至内容页面 问题: 第三方页面登录后携带 ticket 跳转home首页,再使用用户微信openId 获取内容: 因为登录后跳转地址种未携带open ...

最新文章

  1. 并发编程的那些事。(二)
  2. 如何成为一名现代的Linux程序员
  3. 29、Power Query-分支语句的进阶
  4. python预处理缺失值_[Scikit-Learn] - 数据预处理 - 缺失值(Missing Value)处理
  5. 在jenkins上配置Android项目(git管理,gradle构建)
  6. Scala的自定义类型标记
  7. java 匹配mysql按钮_使用Java在mysql查询中设置匹配函数
  8. Windows 查看端口被哪些程序占用
  9. 微信、支付宝否认提供「锁定 35 万人」数据;苹果押宝中国 5G 市场;TiDB 4.0.1 发布 | 极客头条...
  10. if语句中的赋值与判断
  11. live555 rtsp直播卡顿马赛克优化
  12. 千年3 『自动杀猪·无限挂』千年3脚本 千年3外挂
  13. ndwi是什么意思_NDWI是什么意思
  14. 解决javaWeb图片加载不出来问题的方案
  15. Output输出缓存区大小只有1024KB,超过大小限制的就会被清除
  16. 20个创意的产品包装设计
  17. MATLAB基础——设置符号变量sym,syms,symfun,symvar
  18. CV_RETR_TREE’ was not declared in this scope
  19. XGBoost的原理、公式推导
  20. 漫画:什么是 “牛奶咖啡” 问题?

热门文章

  1. 大师兄科研网_哈哈,这才是研究生的科研日常是真的惨!但看完研究生学历到底值多少钱?我酸了~...
  2. 解决oracle数据库conn scott /tiger 连接不上的问题;待验证
  3. 服务器pg信号指的是什么信号,主板的复位信号和PG信号
  4. 震惊!xpath定位不到对应元素节点
  5. 软件测试基础-更高级别的测试、调试、极限测试
  6. Moto ME525+(ME526, Defy+)刷机经历(烧砖)
  7. 简单用Python+OpenCv实现AI人脸识别--(3)—训练人脸识别模型
  8. 大数据学习:学习大数据需要多少钱
  9. 鸟哥的私房菜00--计算器概论
  10. 云服务器安装detectron2报错