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

safe and secure HTTPCookie storage in ASP.NET MVC C# application

我正在使用下面的 class 来处理 cookie 并将它们用于 store/read 我的 ASP.NET MVC 应用程序中的值(例如购物车项目等)

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

2.How 我可以修改此 class 以将 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"