#region AES Encryption public static async Task<bool> EncryptAesFileAsync(StorageFile fileForEncryption, string aesKey256, string iv16lenght) { bool success = false; try { //Initialize key IBuffer key = Convert.FromBase64String(aesKey256).AsBuffer(); var m_iv = Convert.FromBase64String(iv16lenght).AsBuffer(); SymmetricKeyAlgorithmProvider provider = SymmetricKeyAlgorithmProvider.OpenAlgorithm(SymmetricAlgorithmNames.AesCbcPkcs7); var m_key = provider.CreateSymmetricKey(key); //secured data IBuffer data = await FileIO.ReadBufferAsync(fileForEncryption); IBuffer SecuredData = CryptographicEngine.Encrypt(m_key, data, m_iv); await FileIO.WriteBufferAsync(fileForEncryption, SecuredData); success = true; } catch (Exception ex) { success = false; DialogHelper.DisplayMessageDebug(ex); } return success; } public static async Task<bool> DecryptAesFileAsync(StorageFile EncryptedFile, string aesKey256, string iv16lenght) { bool success = false; try { //Initialize key IBuffer key = Convert.FromBase64String(aesKey256).AsBuffer(); var m_iv = Convert.FromBase64String(iv16lenght).AsBuffer(); SymmetricKeyAlgorithmProvider provider = SymmetricKeyAlgorithmProvider.OpenAlgorithm(SymmetricAlgorithmNames.AesCbcPkcs7); var m_key = provider.CreateSymmetricKey(key); //Unsecured Data IBuffer data = await FileIO.ReadBufferAsync(EncryptedFile); IBuffer UnSecuredData = CryptographicEngine.Decrypt(m_key, data, m_iv); await FileIO.WriteBufferAsync(EncryptedFile, UnSecuredData); success = true; } catch (Exception ex) { success = false; DialogHelper.DisplayMessageDebug(ex); } return success; } #endregion
我会尽量保持简短,但有几种方法可以解决这个问题,首先让我们谈谈 UWP storage 第一。
UWP storage
UWP提供API以存储用户首选项和设置以及三种类型的存储中的数据:
Local
Access Violation Exception
PasswordVault
sign in
Roaming
Settings
Preferences
Windows 10 OS
windows 10
现在我们已经了解了我们的选项,让我们尝试解决您的问题,以及如何选择存储。
由于您必须通过多个设备传输数据,因此 Local 存储是不可能的。现在我们还有两个选择 PasswordVault 和 RoamingStorage / RoamingSettings 。
RoamingStorage / RoamingSettings
问题是,你想要转移什么(你使用一个驱动器),它只是一堆偏好?或者它是不同大小的文件?或者是用户凭证?
DataTransfer
signIn
RoamingSettings
APIs
RoamingStorage
one drive
如果您有存储的文件,这种方法可能非常简单 one drive ,
当用户第一次登录应用程序时,请检查是否 roamSettings 对于您的应用程序的Microsoft帐户是否存在,因为它不会返回给您 null 。在这种情况下,创建一个 RoamingStorage 然后继续第2步。
roamSettings
null
创建 keys 这将是加密所需要的。 (解释于 细节见下节)
keys
现在你有了 keys ,您执行所有操作以获取需要写入文件的数据。
使用。加密数据 keys 对于 encryption 一旦数据被加密,将其写入文件并上传到 oneDrive 。
encryption
oneDrive
存放 keys (在下面的下一节中解释)成 roaming storage 对于该Microsoft帐户。
roaming storage
现在,当用户使用其他设备登录您的应用时,如同 point 1 ,检查是否存在 roamingSettings 。只有这次它不会为空,你会得到用户的 roamingSettings 将应用程序放入您的其他设备。提取存储的 key 从那里并保持在一个 variable 。
point 1
roamingSettings
key
variable
从中下载文件 oneDrive 并阅读他们的内容 string 。
string
使用 key 存储在变量(点6)中以解密文件的数据
现在您拥有实际数据,恢复您的应用程序流程。
加密超出了这个问题的范围,所以我只是解释它的基本托梁,如果需要任何帮助,请使用评论部分。
上述解决方案还取决于您在此处使用的加密类型(如果是)
的 Symmetric : 强> 如果你使用对称(如 AES ),然后你生成一个 encryption key 和 InitializationVector (也被称为 IV )一旦用户登录并将其存储在第一台设备上 RoamingSettings
Symmetric
AES
encryption key
InitializationVector
IV
的 Asymmetric : 强> 如果你使用不对称(如 RSA ),你将生成一组键 publicKey 和 privateKey 使用 publicKey 加密数据然后存储它 one drive 然后存储 privateKey 进入漫游设置。
Asymmetric
RSA
publicKey
privateKey
不推荐在非对称加密的情况下通过网络共享私钥,但这有点不同寻常,但您使用Microsoft已建立的API来传输数据(他们声称是安全的),这样可以降低风险。
如果我跳过任何东西,请告诉我。
说实话,既然你提到过单身 key 你在谈论 AES-256 。现在,如果你不想要的话 developer 要访问密钥,它有点像默认,你会使用 Cryptography APIs 微软为 AES 。因此,在某种程度上,您将调用一个API,它将为您提供密钥,并且您将调用另一个将加密数据的API。 的 最重要的是 强> 该API将被调用 runtime 所以开发人员无法访问它。
AES-256
developer
Cryptography APIs
runtime
但是,如果您的查询是开发人员甚至不知道什么样的加密和存储位置,那么在这种情况下,我建议您使用 Factory Pattern 在你身边 abstract 得出的数据的实现 encrypted 您只需传入数据,即类处理所有密钥创建,数据加密和密钥存储以进行漫游,然后返回加密数据。
Factory Pattern
abstract
encrypted
的 参考文献: 强>