【问题标题】:CryptographyException with MachineKey.UnProtect and Cookies in ASP net 4.5ASP net 4.5 中带有 MachineKey.UnProtect 和 Cookie 的 CryptographyException
【发布时间】:2012-12-16 16:04:25
【问题描述】:

我正在尝试用带有 ASP.NET 4.5 的新 MachineKey.ProtectUnprotect 方法替换已弃用的 EncodeDecode 方法。我也使用旧方法来加密和解密 cookie 值,但现在当调用 Unprotect 方法时,我有一个 CryptographyException

我认为这与尝试在 cookie 值中保存保护方法发出的二进制数据的字符串表示有关。

方法很简单:

Public Shared Function Encode(text As String) As String
   If String.IsNullOrEmpty(text) Then
        Return String.Empty
    End If
    Dim stream As Byte() = Encoding.Unicode.GetBytes(text)
    Dim encodedValue As Byte() = MachineKey.Protect(stream, "test")
    Return Encoding.Unicode.GetString(encodedValue)
End Function

Public Shared Function Decode(text As String) As String
    If String.IsNullOrEmpty(text) Then
        Return String.Empty
    End If
    Dim stream As Byte() = Convert.FromBase64String(text)
    Dim decodedValue = MachineKey.Unprotect(stream, "test")
    Return Encoding.Unicode.GetString(decodedValue)
End Function

关于如何使用 cookie 值实现新方法的任何提示?还是我应该坚持使用已弃用的编码/解码方法或 cookie 编码的一些替代方法?

【问题讨论】:

    标签: cookies encode asp.net-4.5


    【解决方案1】:

    Encode 方法的最后一行应该是:

    Return Convert.ToBase64String(encodedValue)
    

    这样,它可以传递给您的 Decode 方法,在该方法中,您尝试将输入解释为 Base64,然后再将其传递给 Unprotect 方法。

    (仅供参考,如果您要加密的数据是基于拉丁语的文本,例如英语,您可能需要考虑使用 Encoding.UTF8 而不是 Encoding.Unicode。它会导致加密的有效载荷更小。)

    【讨论】:

    • 好的,我确定问题与您所说的转换有关,但仍然找不到正确的行为。我会按照你的建议再试一次,然后回来报告。现在谢谢
    • 另一个建议:如果您将其存储在 cookie 中,请考虑改用 HttpServerUtility.UrlTokenEncode / UrlTokenDecode。这些方法与 ToBase64String / FromBase64String 非常相似,但稍作调整,以免在 cookie 中引起问题。 (例如,调整后的方法不像常规 Base64 那样使用 '=' 字符。)
    • 如果可以的话,我会投票 10 亿次。只是花了一个小时试图弄清楚这一点,这个问题和答案就成功了。谢谢!
    猜你喜欢
    • 2012-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-15
    • 2013-05-07
    相关资源
    最近更新 更多