首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用System.Web.Security.MachineKey.Encode取代System.Web.Security.MachineKey.Protect

用System.Web.Security.MachineKey.Encode取代System.Web.Security.MachineKey.Protect
EN

Stack Overflow用户
提问于 2015-11-12 14:43:01
回答 2查看 2.7K关注 0票数 2

我刚刚将一个项目从.NET 4.0升级到.NET 4.5.1,它产生了以下警告:

公共共享函数编码(data()为Byte,protectionOption为System.Web.Security.MachineKeyProtection)为String:“此方法已过时,仅为与现有代码兼容而提供。建议新代码使用保护和取消保护方法。”

我有很多价值浮动在饼干和电子邮件中,这些都是用密码加密的。如果我要用保护/解除保护替换编码/解码,我仍然需要能够解密那些旧的加密值。是否有可能解除使用编码加密的值的保护?

EN

回答 2

Stack Overflow用户

发布于 2016-01-25 09:15:31

在.NET 4.0中,您可以使用MachineKey API来保护/解除保护数据,如下所示:

代码语言:javascript
复制
string Protect(byte[] data)
{
    if (data == null || data.Length == 0) return null;
    return MachineKey.Encode(data, MachineKeyProtection.All);
}

byte[] Unprotect(string value)
{
    if (String.IsNullOrWhiteSpace(value)) return null;
    return MachineKey.Decode(value, MachineKeyProtection.All);
}

MachineKey.Encode接受一个byte[]来保护并返回一个字符串。第二个参数是一个枚举,它指示您是否需要加密、验证或两者都要。我通常会建议两者兼而有之(MachineKeyProtection.All)。然后,可以使用返回的字符串作为cookie值或查询字符串值传递回客户端,而无需考虑查看或篡改。MachineKey.Decode简单地逆转了这个过程。

下面是4.5的用法:

代码语言:javascript
复制
string Protect(byte[] data)
{
    if (data == null || data.Length == 0) return null;
    var value = MachineKey.Protect(data, "");
    return Convert.ToBase64String(value);
}

byte[] Unprotect(string value)
{
    if (String.IsNullOrWhiteSpace(value)) return null;
    var bytes = Convert.FromBase64String(value);
    return MachineKey.Unprotect(bytes, "");
}

在4.5中,旧的API不再受欢迎,而支持这些新的ProtectUnprotect API。新的API不再接受保护级别(它们现在总是加密和MAC,这是好的),而是现在接受一个新的参数,称为purpose。此目的参数在某种程度上用作验证机制。如果我们使用一个特定于用户的值(就像上面对GetMachineKeyPurpose助手所做的那样),那么我们将验证该值只能由同一个用户不受保护。这是4.5中的一个很好的补充。

票数 4
EN

Stack Overflow用户

发布于 2016-01-25 08:48:18

不-这个过程不一样。更不用说,您将尝试解除对没有指定额外参数的数据的保护(这将无法工作),有时使用指定的附加参数对数据进行解码(如果您理想地利用了保护的工作方式)

我会重构代码,以便能够判断旧数据何时出现,并使用Protect()编写一个新的cookie/等等;

在我提到的第一种情况中,您不能在保护中使用空白参数,例如

代码语言:javascript
复制
var unprotect = MachineKey.Unprotect(Encoding.UTF8.GetBytes(myOldEncryptedStuff), "");

如果您有其他代码,比如"User 12345“,以帮助保护数据--这称为目的字符串,并有助于将该字符串以更独特的方式绑定到该用户。

代码语言:javascript
复制
var unprotect = MachineKey.Unprotect(Encoding.UTF8.GetBytes(myOldEncryptedStuff), "User 12345")

如果目的字符串不匹配,这里只会得到一个通用的异常,如下所示:

在加密操作期间发生System.Security.Cryptography.CryptographicException:错误。

所以这对你不起作用--这两种方法的操作非常不同。你需要弄清楚什么时候使用其中一种对另一种。您可以始终捕捉到异常,然后尝试回到旧的技术--但是测试一下:)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33674059

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档