Приложение My UWP хранит данные в зашифрованном виде в локальной базе данных SQLite на устройстве. Я использую классы Windows.Security.Cryptography.DataProtection
для статических данных, а также для шифрования/дешифрования потоков данных (Ref: https://docs.microsoft.com/en-us/windows/uwp/security/cryptography)
Я предоставил средство резервного копирования данных OneDrive с идеей, что пользователь может сделать резервную копию всей базы данных OneDrive с одного устройства и восстановить ее в приложении, установленном на другом устройстве. Это может помочь пользователю использовать приложение на нескольких устройствах, а также в случае приобретения пользователем нового устройства.
Я использую дескриптор "LOCAL=user"
для класса DataProtectionProvider
(Ref: https://docs.microsoft.com/en-us/uwp/api/windows.security.cryptography.dataprotection.dataprotectionprovider)
Я надеялся, что если я войду в систему с помощью моей учетной записи Microsoft на двух разных устройствах, и я зашифрую данные на одном устройстве, а затем восстановите данные на другом, тогда данные должны быть дешифрованы; однако этого не происходит.
Мне также не удалось получить документацию (кроме ссылок, перечисленных выше). Я также искал SO для поддержки MS, но не повезло. Может кто-нибудь помочь мне с этим?
Мое требование: данные, зашифрованные на одном (Windows) устройстве, должны быть дешифрованы на другом (Windows) устройстве (когда пользователь регистрируется с использованием той же учетной записи Microsoft на обоих устройствах).
[ОБНОВЛЕНИЕ]
Здесь пример кода:
const BinaryStringEncoding encoding = BinaryStringEncoding.Utf8;
const string strDescriptor = "LOCAL=user";
public static async Task<string> ProtectTextAsync(string strClearText)
{
DataProtectionProvider Provider = new DataProtectionProvider(strDescriptor);
IBuffer buffMsg = CryptographicBuffer.ConvertStringToBinary(strClearText, encoding);
IBuffer buffProtected = await Provider.ProtectAsync(buffMsg);
return CryptographicBuffer.EncodeToBase64String(buffProtected);
}
public static async Task<String> UnprotectTextAsync(string strProtected)
{
DataProtectionProvider Provider = new DataProtectionProvider();
IBuffer buffProtected = CryptographicBuffer.DecodeFromBase64String(strProtected);
IBuffer buffUnprotected = await Provider.UnprotectAsync(buffProtected);
String strClearText = CryptographicBuffer.ConvertBinaryToString(encoding, buffUnprotected);
return strClearText;
}
Код тривиален; однако процесс воспроизведения ошибок важен и выглядит следующим образом:
Я запустил приложение на своем Windows 10 Mobile (OS build: 10.0.14393.1770), затем выполнил резервное копирование данных на OneDrive. Мой мобильный телефон показывает, что я использую учетную запись Microsoft (например, [email protected]) в настройках → Учетные записи → Информация.
Теперь я подключился к своему ноутбуку под управлением Windows 10 (версия ОС: 15063.674 версии: 1703 с обновлением Fall Creators Update SDK), используя учетную запись [email protected], когда я запускаю приложение и Восстановите резервную копию с OneDrive.
Теперь, когда я пытаюсь получить доступ к данным, я получаю ошибку в строке IBuffer buffUnprotected = await Provider.UnprotectAsync(buffProtected);
метода UnprotectTextAsync
. Ошибка:
System.Exception: 'The specified data could not be decrypted. (Excep_FromHResult 0x8009002C)'
Обратите внимание, что если я восстановил резервную копию данных на OneDrive с того же устройства (Mobile или Laptop), тогда этот код будет работать нормально. Таким образом, функция Backup/Restore работает корректно без изменения данных.