在 ASP.NET 中加密 cookie
Posted
技术标签:
【中文标题】在 ASP.NET 中加密 cookie【英文标题】:Encrypt cookies in ASP.NET 【发布时间】:2011-05-20 15:18:07 【问题描述】:我想。
我关注了the method in this article,但它的缺点是在内部方法上使用了反射。这导致它在代码审查中被标记——它不是面向未来的,因为内部实现可能会发生变化。
是否有不需要对内部方法使用加密的具有相同功能的方法?
我正在使用 .NET Framework 3.5 SP1(假设我无法更改框架版本)
【问题讨论】:
【参考方案1】:你不再需要自己动手了。
.Net 4.5 有MachineKey.Protect()
和MachineKey.Unprotect()
。
System.Web.Security.MachineKey
.Net 4.0 有MachineKey.Encode()
和MachineKey.Decode()
。您应该将 MachineKeyProtection 设置为“全部”。不过这些现在已经过时了,如果你有 4.5,你应该使用较新的。
请注意,如果您尝试在控制台应用程序而不是 ASP.Net 中使用它们,它似乎会在每次应用程序重新启动时生成一个新密钥。我只是快速检查了它,但在 ILSpy 中,如果缺少相应的 app.setting,它看起来会生成自己的默认值。
我无法找到非 ASP.Net 的等价物。
【讨论】:
如何在农场使用?我们在负载均衡器后面有多个服务器 我假设他们必须共享相同的机器密钥,您可以在 web.config 中设置而不是使用默认的机器密钥。见***.com/questions/3855666/… 和msdn.microsoft.com/en-us/library/…【参考方案2】:为什么不直接使用the encryption found in System.Security.Cryptography 对敏感的cookie 名称和值进行加密和解密呢?您可以编写一些实用程序函数来轻松管理它。实用函数示例:
private static void SetEncryptedCookie(string name, string value)
var encryptName = SomeEncryptionMethod(name);
Response.Cookies[encryptName].Value = SomeEncryptionMethod(value);
//set other cookie properties here, expiry &c.
//Response.Cookies[encryptName].Expires = ...
private static string GetEncryptedCookie(string name)
//you'll want some checks/exception handling around this
return SomeDecryptionMethod(
Response.Cookies[SomeDecryptionMethod(name)].Value);
【讨论】:
我提到的内部方法为加密增加了一些随机性,因此每次加密的文本都不同。你提到的方法没有 - 我认为。 嗯?加密数据时添加随机盐不是推荐的做法吗? @frankadelic,盐有助于防止通过彩虹表暴力破解用户提供的密码。机器密钥和其他大型生成的私钥不会从加盐中受益。 加密实现看似简单,我已经移植了google的Keyczar to .net封装更多,例如认证加密和密钥轮换在加密cookie时都非常重要。 哇,这里的散列和加密之间有这么多的混淆。加盐用于散列以防止彩虹表。在加密中建议第一个块(密钥的大小)也是随机的,这被称为初始化向量,这可以确保加密的输出不会两次相同数据。在 .NET 中,大多数加密方法都有一个初始化为随机的 IV 属性,尽管您需要在输出中包含它(它不需要保密),以便您可以解密它。需要保密的是您的密钥以上是关于在 ASP.NET 中加密 cookie的主要内容,如果未能解决你的问题,请参考以下文章
asp.net (C#) 平台下如何加密用户登录密码?请高手请教。
asp用urlEncode加密后的中文用asp.net UrlDecode解密会出现乱码,请问怎么解决
将 WebAPI JWT 访问令牌作为加密的 FormsAuthenticationTicket 存储在 Response.Cookies 中是不是安全(在 asp.net mvc 中)