如何使用MachineKey.Protect作为cookie?

我想加密我在cookie中使用的ID。 我正在使用ASP.NET 4.5,所以我想使用MachineKey.Protect来做到这一点。

  public static string Protect(string text, string purpose) { if (string.IsNullOrEmpty(text)) return string.Empty; byte[] stream = Encoding.Unicode.GetBytes(text); byte[] encodedValue = MachineKey.Protect(stream, purpose); return HttpServerUtility.UrlTokenEncode(encodedValue); } public static string Unprotect(string text, string purpose) { if (string.IsNullOrEmpty(text)) return string.Empty; byte[] stream = HttpServerUtility.UrlTokenDecode(text); byte[] decodedValue = MachineKey.Unprotect(stream, purpose); return HttpServerUtility.UrlTokenEncode(decodedValue); } 

当我使用以下测试数据时:

Protect()

输入:775119337

输出:(Cookie)“HyV7ShLrb61cm9HWoHl2lUJtGMlMxLn60q27xwl7Ae1wpv31p7sJqfRDD8TMoSR8n8PPN1K7k7LsrjqWH6A-P17OblK3MApsDQRQLa8xj9A1”

UnProtect()

输出:“NwA3ADUAMQAxADkAMwAzADcA0”

输出不正确,当然,它应该是原始ID I输入。

如何使用MachineKey.UnProtect()解密cookie?

decodedValue是您传递给MachineKey.Protect()的字节数。
这不是UrlTokenEncoded; 它是Unicode编码的字节。

您需要调用Encoding.Unicode.GetString()


来自OP:

 public static string Protect(string text, string purpose) { if (string.IsNullOrEmpty(text)) return null; byte[] stream = Encoding.UTF8.GetBytes(text); byte[] encodedValue = MachineKey.Protect(stream, purpose); return HttpServerUtility.UrlTokenEncode(encodedValue); } public static string Unprotect(string text, string purpose) { if (string.IsNullOrEmpty(text)) return null; byte[] stream = HttpServerUtility.UrlTokenDecode(text); byte[] decodedValue = MachineKey.Unprotect(stream, purpose); return Encoding.UTF8.GetString(decodedValue); }