ASP.NET MVC C# 应用程序中安全可靠的 HTTPCookie 存储

如何解决ASP.NET MVC C# 应用程序中安全可靠的 HTTPCookie 存储

我使用下面的类来处理 cookie 并使用它们在我的 ASP.NET MVC 应用程序中存储/读取值(例如购物车项目等)

1.我想知道值是否在浏览器中存储时没有任何安全性,任何人都可以查看其内容(使用以下实现)?我检查了值是否存储为一些十六进制值,但我怀疑此实现中是否存在任何特定的加密/安全性。

2.如何修改该类以将 cookie 值存储为加密信息?

using System;
using System.Web;

namespace My.Application.Sample
{
    public class CookieStore
    {


        public static void SetCookie(string key,string value)
        {
            SetCookie(key,value,TimeSpan.FromDays(14));
        }

        public static void SetCookie(string key,string value,TimeSpan expires)
        {
            string encodedValue = HttpUtility.UrlEncode(value);
            HttpCookie encodedCookie = new HttpCookie(key,encodedValue);

            if (HttpContext.Current.Request.Cookies[key] != null)
            {
                var cookieOld = HttpContext.Current.Request.Cookies[key];
                cookieOld.Expires = DateTime.Now.Add(expires);
                cookieOld.Value = encodedCookie.Value;
                HttpContext.Current.Response.Cookies.Add(cookieOld);
                
            }
            else
            {
                encodedCookie.Expires = DateTime.Now.Add(expires);
                HttpContext.Current.Response.Cookies.Add(encodedCookie);
            }
        }
        
        /// <summary>
        /// Return value stored in  a cookie by defined key,if not found returns empty string
        /// </summary>
        /// <param name="key"></param>
        /// <returns> never returns null! :) </returns>
        public static string GetCookie(string key)
        {
            string value = string.Empty;
            try
            {
                HttpCookie cookie = HttpContext.Current.Request.Cookies[key];

                //if (cookie != null)
                //{
                //    // For security purpose,we need to encrypt the value.
                //    HttpCookie decodedCookie = HttpSecureCookie.Decode(cookie);
                //    value = decodedCookie.Value;
                //}
                if (cookie != null)
                {
                    string encodedValue = cookie.Value;
                    value = HttpUtility.UrlDecode(encodedValue);
                }
            }
            catch (Exception)
            {

            }
            return value;
        }

    }
}

解决方法

您可以使用ProtectUnprotect 方法来加密cookie。请注意,两个字节具有相同的键值。使用 Protect 加密的数据只能使用 Unprotect 解密。

加密方法

public string encryptedCookie(string value)
{
    var cookieText = Encoding.UTF8.GetBytes(value);
    var encryptedValue = Convert.ToBase64String(MachineKey.Protect(cookieText,"ProtectCookie"));
    return encryptedValue;
}
      

解密方法

public string decryptedCookie(string value)
{
    var bytes = Convert.FromBase64String(value);
    var output = MachineKey.Unprotect(bytes,"ProtectCookie");
    string result = Encoding.UTF8.GetString(output);
    return result;
}

您可以使用您的唯一键来代替 "ProtectCookie"

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?