SQLite защитен Windows Phone 8.1

Имам универсално приложение за windows. В това приложение използвам SQLite и трябва да защитя този файл. Той се записва в LocalFolder и потребителят има достъп до него.

Трябва да задам достъп само за моето ПРИЛОЖЕНИЕ или да задам парола за тази база данни или нещо друго. Моля, знаете ли за разширение, което може да ми помогне?

Благодаря


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


Отговори (1)


В 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);
}

Горният код разбира се е много прост и трябва да се подобри, но може би ще ви помогне да започнете. Също така не забравяйте да защитите секретния си ключ, не е толкова трудно да декомпилирате пакета.

person Romasz    schedule 20.01.2015
comment
Несигурен, използва ключовия материал като IV. IV трябва да бъде рандомизиран, ако ключът се използва повторно. - person Maarten Bodewes; 28.02.2015
comment
@MaartenBodewes Благодаря ви за коментара - определено сте прав. Редактирах кода, като добавих прости подобрения. Моля, дайте ми знак, ако имате допълнителни забележки. - person Romasz; 28.02.2015