SQLite безопасный Windows Phone 8.1

3

У меня есть универсальное приложение для Windows. В этом приложении я использую SQLite, и мне нужно защитить этот файл. Он сохраняется в LocalFolder, и пользователь имеет к нему доступ.

Мне нужно установить доступ только для моего APP или установить пароль для этой базы данных или что-нибудь еще. Пожалуйста, вы знаете о расширении, которое может мне помочь?

Спасибо

Теги:
security
win-universal-app
windows-phone-8.1

1 ответ

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

В API Windows Store вы найдете несколько пространств имен, которые, я думаю, вы можете использовать для своей цели: Windows.Security.Cryptography, Windows.Security.Cryptography.Core и Windows.Security.Cryptography.DataProtection.

Отредактировано после комментария Maarten Bodewes - добавлен рандомизированный вектор инициализации.

Очень простой пример шифрования некоторых данных может выглядеть так:

/// <summary>
/// Method encrypting data in source file and saving to target file
/// </summary>
/// <param name="backupKey">secret key</param>
/// <param name="sourceFile">source file with data</param>
/// <param name="targetFile">encrypted file</param>
public static async Task EncryptFile(string backupKey, StorageFile sourceFile, StorageFile targetFile)
{
    SymmetricKeyAlgorithmProvider algorithm = SymmetricKeyAlgorithmProvider.OpenAlgorithm(SymmetricAlgorithmNames.AesCbcPkcs7);
    IBuffer keymaterial = CryptographicBuffer.ConvertStringToBinary(backupKey, BinaryStringEncoding.Utf8);
    IBuffer initVector = CryptographicBuffer.GenerateRandom(32);
    CryptographicKey key = algorithm.CreateSymmetricKey(keymaterial);           
    IBuffer output = CryptographicEngine.Encrypt(key, await FileIO.ReadBufferAsync(sourceFile), initVector);           
    await Windows.Storage.FileIO.WriteTextAsync(targetFile, CryptographicBuffer.EncodeToBase64String(initVector) + CryptographicBuffer.EncodeToBase64String(output));
}

/// <summary>
/// Method decrypting a file
/// </summary>
/// <param name="backupKey">secret key</param>
/// <param name="encryptedFile">source file with encrypted data</param>
/// <returns>buffer with devrypted data</returns>
public static async Task<IBuffer> DecryptFile(string backupKey, StorageFile encryptedFile)
{
    string entry = await Windows.Storage.FileIO.ReadTextAsync(encryptedFile);
    IBuffer initVector = CryptographicBuffer.DecodeFromBase64String(entry.Substring(0, 44));
    IBuffer input = CryptographicBuffer.DecodeFromBase64String(entry.Substring(44));
    SymmetricKeyAlgorithmProvider algorithm = SymmetricKeyAlgorithmProvider.OpenAlgorithm(SymmetricAlgorithmNames.AesCbcPkcs7);
    IBuffer keymaterial = CryptographicBuffer.ConvertStringToBinary(backupKey, BinaryStringEncoding.Utf8);
    CryptographicKey key = algorithm.CreateSymmetricKey(keymaterial);
    IBuffer inputDecrypted = CryptographicEngine.Decrypt(key, input, initVector);
    Debug.WriteLine("Encrypted message: {0}", CryptographicBuffer.ConvertBinaryToString(BinaryStringEncoding.Utf8, inputDecrypted));
    return inputDecrypted;
}

Я протестировал его вот так:

private const string mySuperSecretKey = @"s3cr3tsadjfjlksdfj@^&^$)(ojfaapsojowejiwfpkwfvz";
private async void firstBtn_Click(object sender, RoutedEventArgs e)
{
    var sourceFile = await Package.Current.InstalledLocation.GetFileAsync("TestMessage.txt");
    var targetFile = await ApplicationData.Current.LocalFolder.CreateFileAsync("EncryptedMessage.txt", CreationCollisionOption.ReplaceExisting);
    await EncryptFile(mySuperSecretKey, sourceFile, targetFile);            
}

private async void secondBtn_Click(object sender, RoutedEventArgs e)
{
    var sourceFile = await ApplicationData.Current.LocalFolder.GetFileAsync("EncryptedMessage.txt");
    var dataDecrypted = await DecryptFile(mySuperSecretKey, sourceFile);
}

Вышеприведенный код, конечно, очень прост и должен быть улучшен, но, возможно, поможет вам начать. Также, пожалуйста, не забудьте защитить свой секретный ключ, это не так сложно декомпилировать пакет.

  • 1
    Небезопасно, использует материал ключа как IV. IV следует рандомизировать, если ключ используется повторно.
  • 0
    @MaartenBodewes Спасибо за комментарий - вы определенно правы. Я отредактировал код, добавив простые улучшения. Пожалуйста, дайте мне знак, если у вас есть дополнительные замечания.

Ещё вопросы

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