У меня есть универсальное приложение для Windows. В этом приложении я использую SQLite, и мне нужно защитить этот файл. Он сохраняется в LocalFolder, и пользователь имеет к нему доступ.
Мне нужно установить доступ только для моего APP или установить пароль для этой базы данных или что-нибудь еще. Пожалуйста, вы знаете о расширении, которое может мне помочь?
Спасибо
В 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);
}
Вышеприведенный код, конечно, очень прост и должен быть улучшен, но, возможно, поможет вам начать. Также, пожалуйста, не забудьте защитить свой секретный ключ, это не так сложно декомпилировать пакет.