ASP.NET Core - Защита данных

В моем приложении я настроил механизм защиты данных для хранения сгенерированных ключей в файле в моей системе:

services.AddDataProtection()
    .PersistKeysToFileSystem(new DirectoryInfo(@"C:\keys"));

И это работает. В моем каталоге «ключей» был сгенерирован файл с таким содержанием:

<?xml version="1.0" encoding="utf-8"?>
<key id="7139a96c-1d75-468f-a343-1d0d363650a7" version="1">
  <creationDate>2019-04-22T14:27:34.9530001Z</creationDate>
  <activationDate>2019-04-22T14:27:34.9359888Z</activationDate>
  <expirationDate>2019-07-21T14:27:34.9359888Z</expirationDate>
  <descriptor deserializerType="Microsoft.AspNetCore.DataProtection.AuthenticatedEncryption.ConfigurationModel.AuthenticatedEncryptorDescriptorDeserializer, Microsoft.AspNetCore.DataProtection, Version=2.2.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60">
    <descriptor>
      <encryption algorithm="AES_256_CBC" />
      <validation algorithm="HMACSHA256" />
      <masterKey p4:requiresEncryption="true" xmlns:p4="http://schemas.asp.net/2015/03/dataProtection">
        <!-- Warning: the key below is in an unencrypted form. -->
        <value>JzykGRqFcYWq3MPQAyuXe4IlEGrj62ghnCEMMuv0YzRKmHjzlfSOcbnk7+cJpDGe0PLKfCwcNPfOKplqu1xfDg==</value>
      </masterKey>
    </descriptor>
  </descriptor>
</key>

Теперь я не понимаю одного. Я использую алгоритм AES_256_CBC, но длина ключа составляет 88 символов вместо 32 символов.

Итак, я понял, что ключ кодируется с помощью base64. После расшифровки у нас есть следующий ключ:

"'<¤qªÜÃÐ+{%jãëh!! 2ëôc4Jxóôq¹äïç ¤1ÐòÊ|,4÷Î*j»_"

Но в нем 66 символов вместо 32. Как получить 32-битный симметричный ключ AES, потому что я не понимаю, как ASP.NET Core сохраняет этот ключ.

Буду очень признателен за любую помощь.


person Makilll    schedule 22.04.2019    source источник
comment
ДА! Я пытаюсь сохранить ключ через Redis, но не могу найти никакой документации по структуре де / сериализации. Convert.FromBase64String (key) дает 64-байтовое значение, но AES_256_CBC работает только с 32-байтовым ключом?   -  person Alex Jarkey    schedule 04.06.2019


Ответы (2)


Значение masterKey в связке ключей, по-видимому, на самом деле является 64-байтовым ключом производного ключа (KDK), а не простым ключом base64 AES.

https://docs.microsoft.com/en-us/aspnet/core/security/data-protection/implementation/subkeyderivation?view=aspnetcore-2.2

Это означает, что вы можете получить подраздел AES из этого KDK. Вот как по умолчанию ManagedryAuthenticated делает это.

Если я смогу найти или написать автономную функцию извлечения ключей, я добавлю ее сюда (если только кто-то меня не опередит).

Надеюсь, это поможет!

Изменить 1:

Через пять дней работы я смог собрать вместе различные части кодовую базу AspNetCore в это чудовище. Если вы можете правильно определить значение AAD, это позволит извлечь ключи AES и SHA256 из KDK, а затем расшифровать полезные данные общих файлов cookie ASPNetCore.

person Alex Jarkey    schedule 07.06.2019

Чтобы помочь вам, я написал реализацию, которая хранит связку ключей Data Proteciton в Azure Key Vault. Я писал об этом здесь:

Хранение связки ключей защиты данных ASP.NET Core в Azure Key Vault

Однако возникает вопрос, почему вам нужно иметь дело с отдельными ключами на уровне байтов / base64? Чтобы хранить их в другом месте, вы просто реализуете интерфейс IXmlRepository, и использовать его очень просто. Нет необходимости иметь дело с необработанными байтами ключа.

person Tore Nestenius    schedule 12.10.2020