Как использовать MachineKey.Protect для файла cookie?

Я хочу зашифровать идентификатор, который я использую в файле cookie. Я использую 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)

UnProtect():

Выход: NwA3ADUAMQAxADkAMwAzADcA0

Вывод, конечно, неверен, это должен быть исходный ID I Input.

Как расшифровать файл cookie с помощью MachineKey.UnProtect()?


person David    schedule 17.05.2013    source источник
comment
Вероятно, вам следует использовать UTF8 для более коротких строк.   -  person SLaks    schedule 18.05.2013


Ответы (1)


decodedValue — это байты, которые вы передали MachineKey.Protect().
Это не UrlTokenEncoded; это байты в кодировке Unicode.

Вам нужно позвонить Encoding.Unicode.GetString().


Из ОП:

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);
}
person SLaks    schedule 17.05.2013
comment
Спасибо за это объяснение. Это помогло мне с ошибками Base64, которые продолжали возникать! Есть много других вопросов и ответов, связанных с этим, которые я хотел бы включить в ваше объяснение. - person Marcel Gruber; 30.11.2016