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

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

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

Спасибо


person Flow    schedule 20.01.2015    source источник


Ответы (1)


В Windows Store API вы найдете несколько пространств имен, которые, я думаю, вы можете использовать для своих целей: 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);
}

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

person Romasz    schedule 20.01.2015
comment
Небезопасно, использует ключевой материал как IV. IV должен быть рандомизирован, если ключ используется повторно. - person Maarten Bodewes; 28.02.2015
comment
@MaartenBodewes Спасибо за комментарий - вы определенно правы. Я отредактировал код, добавив простые улучшения. Пожалуйста, дайте мне знак, если у вас есть дополнительные замечания. - person Romasz; 28.02.2015