Чтение / запись зашифрованных и аутентифицированных данных из / в файл в приложении Магазина Windows

1

Я хочу зашифровать содержимое файла в приложении Windows Metro. Этот файл хранится локально (папка LocalState) в устройстве и содержит длинную строку, которую я не хочу, чтобы пользователь мог изменять (легко). Приложение, скорее всего, зашифрует и расшифрует файл с помощью симметричного ключа.

Защита, которую это обеспечивает, открыта для обсуждения, потому что приложение может быть взломанным для получения ключа. Тем не менее, это приемлемо для меня, если пользователь не может напрямую изменять/форматировать файл. Я считаю, что аутентифицированное шифрование - это способ сделать это, но мои знания в этой теме не совсем велики.

Я потратил много времени, пытаясь зашифровать строку с помощью API Metro Metro, используя классы SymmetricKeyAlgorithmProvider и EncryptedAndAuthenticatedData. Тем не менее, примеры использования (от Microsoft или по всему Интернету) кажутся скудными и почти всегда выполняют либо простое шифрование (не аутентифицированное), либо аутентифицированное без сохранения данных. Например, пример здесь шифрует и дешифрует данные последовательно. Фактически, некоторые примеры каждый раз генерируют случайный ключ, который, я считаю, я не могу сделать.

У меня есть что-то вроде:

private EncryptedAndAuthenticatedData authenticatedEncryption(string strMsg, string strKey)
{
    SymmetricKeyAlgorithmProvider objAlgProv = SymmetricKeyAlgorithmProvider.OpenAlgorithm(SymmetricAlgorithmNames.AesGcm);
    IBuffer buffMsg = CryptographicBuffer.ConvertStringToBinary(strMsg, BinaryStringEncoding.Utf8);
    IBuffer buffKey = CryptographicBuffer.ConvertStringToBinary(strKey, BinaryStringEncoding.Utf8);
    IBuffer buffNonce = CryptographicBuffer.CreateFromByteArray(new byte[]{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 });
    CryptographicKey key = objAlgProv.CreateSymmetricKey(buffKey);
    EncryptedAndAuthenticatedData objEncrypted = CryptographicEngine.EncryptAndAuthenticate(key, buffMsg, buffNonce, null);
    return objEncrypted;
}

Как вы можете видеть, я даже использую константу nonce, которая, конечно, не идеальна, но я не мог найти другого пути. Могут быть другие проблемы с этим методом, о которых я не знаю.

Используя этот метод шифрования, я попытался сериализовать объект EncryptedAndAuthenticatedData с помощью DataContractSerializer без каких-либо успехов (объекты этого класса не могут быть сериализованы), и я не нашел способа создать объект EncryptedAndAuthenticatedData из его атрибутов AuthenticationTag и EncryptedData (при условии, что Я мог бы написать их в файл).

Все это означает, что я не нашел способ правильно шифровать и аутентифицировать строку, а тем более сохранять результат в файле, чтобы читать и расшифровывать его позже (у меня есть другой метод аутентифицированного дешифрования, в котором используется ключ и nonce таким же образом).

Вы знаете, если и как я могу это сделать с классами Windows Metro? Есть ли способ лучше?

Теги:
encryption
cryptography
windows-store-apps
windows-runtime

1 ответ

2
Лучший ответ

Поэтому я считаю, что вам проще использовать: DataProtectionProvider.

DataProtectionProvideris - класс, который предоставляет Microsoft, который симметрично шифрует данный byte array или Stream используя ключ, полученный из комбинации идентификатора машины, идентификатора пользователя и идентификатора пакета. Он прост в использовании и должен обеспечивать довольно хорошую защиту довольно легко.

Примеры документов представляют собой простой пример:

public async Task<IBuffer> SampleProtectAsync(
    String strMsg,
    String strDescriptor,
    BinaryStringEncoding encoding)
{
    // Create a DataProtectionProvider object for the specified descriptor.
    DataProtectionProvider Provider = new DataProtectionProvider(strDescriptor);

    // Encode the plaintext input message to a buffer.
    encoding = BinaryStringEncoding.Utf8;
    IBuffer buffMsg = CryptographicBuffer.ConvertStringToBinary(strMsg, encoding);

    // Encrypt the message.
    IBuffer buffProtected = await Provider.ProtectAsync(buffMsg);

    // Execution of the SampleProtectAsync function resumes here
    // after the awaited task (Provider.ProtectAsync) completes.
    return buffProtected;
}

public async Task<String> SampleUnprotectData(
    IBuffer buffProtected,
    BinaryStringEncoding encoding)
{
    // Create a DataProtectionProvider object.
    DataProtectionProvider Provider = new DataProtectionProvider();

    // Decrypt the protected message specified on input.
    IBuffer buffUnprotected = await Provider.UnprotectAsync(buffProtected);

    // Execution of the SampleUnprotectData method resumes here
    // after the awaited task (Provider.UnprotectAsync) completes
    // Convert the unprotected message from an IBuffer object to a string.
    String strClearText = CryptographicBuffer.ConvertBinaryToString(encoding, buffUnprotected);

    // Return the plaintext string.
    return strClearText;
}

В этом случае strDescriptor описывает, кому вы хотите получить доступ к зашифрованному содержимому. Если это кто-то на машине, значение "LOCAL=machine". Если это только данный пользователь, значение "LOCAL=user".

Если вы используете MVC или MVVM, вы можете легко добавить это к чему-то вроде LocalStorageController чтобы все локальное хранилище автоматически зашифровано/дешифровано до того, как оно покинет ваше приложение.

Надеюсь, это поможет и счастливое кодирование!

  • 0
    Спасибо! У меня сейчас работает мой код. Я потратил слишком много времени на это, и в конце концов был более простой подход :) Вы бы сказали, что EncryptedAndAuthenticatedData не подходит (или даже не может использоваться) для шифрования файлов?
  • 0
    Кроме того, этот образец из MSDN, похоже, содержит небольшую ошибку, поскольку метод SampleProtectAsync переопределяет все, что задано в качестве кодировки, из-за строки "encoding = BinaryStringEncoding.Utf8". Более того, одно имя метода заканчивается на «Async», а другое - на «Data» (оба, вероятно, должны заканчиваться на «DataAsync»), но это только я привередлив;)
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню