NP3*_*NP3 12 c# security encryption uwp
我的UWP应用程序以加密形式将数据存储在设备上的本地SQLite数据库中.我使用Windows.Security.Cryptography.DataProtection静态数据类和数据流加密/解密(参考:https://docs.microsoft.com/en-us/windows/uwp/security/cryptography)
我提供了OneDrive数据备份工具,用户可以从一台设备将整个数据库备份到OneDrive,并在另一台设备上安装的应用程序中恢复它.这可以帮助用户在多个设备上使用应用程序,以及用户获取新设备的情况.
我"LOCAL=user"在DataProtectionProvider课堂上使用Descriptor (参考:https://docs.microsoft.com/en-us/uwp/api/windows.security.cryptography.dataprotection.dataprotectionprovider)
我希望如果我在两个不同的设备上使用我的Microsoft帐户登录并在一台设备上加密数据,然后在其他设备上恢复数据,那么数据应该被解密; 然而这并没有发生.
我也无法获得任何文档(除了上面列出的参考文献).我也搜索了MS以获得MS支持,但没有运气.有人可以帮我这个吗?
我的要求:在一个(Windows)设备上加密的数据应该在其他(Windows)设备中解密(当用户在两个设备上使用相同的Microsoft帐户登录时).
[UPDATE]
这是代码示例:
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;
}
Run Code Online (Sandbox Code Playgroud)
代码很简单; 但是,错误再现的过程很重要,如下:
我在Windows 10 Mobile(操作系统版本:10.0.14393.1770)上运行应用程序,然后在OneDrive上备份数据.我的手机显示我在设置 - >帐户 - >您的信息中使用Microsoft帐户(例如NP3@msft.com).
现在,当我运行应用程序并从OneDrive恢复备份时,我使用NP3@msft.com帐户登录到我的Windows 10笔记本电脑(操作系统版本:15063.674版本:1703,仅应用了Fall Creators Update SDK ).现在,当我尝试访问数据时,我得到了该方法的错误.错误是:IBuffer buffUnprotected = await Provider.UnprotectAsync(buffProtected);UnprotectTextAsync
System.Exception: 'The specified data could not be decrypted. (Excep_FromHResult 0x8009002C)'
Run Code Online (Sandbox Code Playgroud)
请注意,如果我从同一设备(移动设备或笔记本电脑)恢复在OneDrive上备份的数据,则此代码可以正常工作.因此,备份/还原功能正常工作,无需修改数据.
我会尽量保持简短,但有几种方法可以解决这个问题,首先我们来谈谈第UWP storage一种。
UWP 提供 API 来将用户首选项和设置以及数据存储在三种类型的存储中:
Local:这基本上是将数据作为应用程序数据存储在设备本身的本地存储中。这里可以存放什么?它适用于可以序列化的各种数据。不能太重,否则会摔倒Access Violation Exception。我曾经用它来将图像存储为字节流,因此它在存储方面提供了很大的灵活性。PasswordVault:这通常是为了跨多个设备存储用户凭据,以便不必sign in在每台设备上使用您的应用程序,如果您有相同的 Microsoft 帐户,它会立即让您登录。您无需显式加密其中的数据,因为 API 会在跨设备传输和存储数据时自动为您加密数据。Roaming:现在这是您最感兴趣的。漫游设置是在您使用同一 Microsoft 帐户登录时跨设备传输的设置。数据不会隐式加密,因此您可能必须处理它的安全问题。它通常用于Settings为应用程序和Preferences用户传输(如果他/她有某些东西(例如应用程序主题、壁纸))。Windows 10 OS当您安装在另一台计算机上时,利用此存储来传输各种内容,您可以在此处windows 10找到完整的列表。这真是太棒了。现在我们已经了解了我们的选项,让我们尝试解决您的问题,以及如何选择存储。
由于必须在多个设备上传输数据,因此Local存储就不再是问题了。现在我们还有两个选择PasswordVault和RoamingStorage / RoamingSettings。
问题是,您想要传输什么(您使用一个驱动器),这只是一堆首选项吗?或者它是不同大小的文件?或者是用户凭据?
PasswordVault则非常适合。如果用户使用相同的 Microsoft 帐户,它不仅可以处理DataTransfer,还可以提供跨设备的无缝集成。signInRoamingSettings. 他们将使用微软自己的设备将数据传输到其他设备APIs,您所要做的就是从RoamingStorage容器中获取它们,然后就可以开始使用数据。one drive并且您想在其他设备上解密,那么我推荐以下解决方案。该方法可能非常简单,如果您有存储在的文件one drive,
当用户第一次登录应用程序时,检查roamSettings您的应用程序的 Microsoft 帐户是否存在,因为不存在,它会返回一个null. 在这种情况下,创建 aRoamingStorage并继续执行步骤 2。
创建keys加密所需的内容。(在下面的下一节中详细解释)
现在您已经有了keys,您可以执行所有操作来获取需要写入文件的数据。
keys使用for对数据进行加密encryption,数据加密后,将其写入文件并上传到oneDrive.
keys将(在下面的下一节中解释)存储到roaming storage该 Microsoft 帐户中。
现在,当用户使用其他设备登录您的应用程序时(如 中所示)point 1,检查是否存在任何roamingSettings. 只是这一次它不会为空,并且您会将roamingSettings应用程序的用户获取到您的其他设备中。从那里提取存储的内容key并将其保存在variable.
从 处下载文件oneDrive并读取其内容string。
使用key变量中存储的(第6点)来解密文件的数据
现在您已经有了实际数据,恢复您的应用程序流程。
加密超出了这个问题的范围,所以我只会解释它的基本托梁,如果需要任何帮助,请使用评论部分。
上述解决方案还取决于您在此处使用的加密类型(如果是)
Symmetric:如果您使用对称(如AES),那么一旦用户登录,您就会在第一个设备上生成encryption key和 一个InitializationVector(也称为)并将它们存储在IVRoamingSettings
Asymmetric:如果您使用非对称(如RSA),您将生成一组密钥publicKey并privateKey使用publicKey来加密数据,然后one drive将其存储privateKey到漫游设置中。
在非对称加密的情况下,不建议通过网络共享私钥,但这有点不合常规,但您使用 Microsoft 既定的 API 来传输数据(他们声称是安全的),这样可以降低风险。
如果我遗漏了任何内容,请告诉我。
老实说,既然你提到了key你正在谈论的单曲AES-256。现在,如果您不希望developer访问该密钥,这有点默认,您将被Cryptography APIsMicrosoft 用于 AES. 因此,在某种程度上,您将调用一个为您提供密钥的 API,并且您将调用另一个将加密数据的 API。最重要的是,API 将被调用,runtime因此无论哪种方式,开发人员都无法访问它。
但是,如果您的查询是开发人员甚至不应该知道哪种加密以及存储在哪里,那么在这种情况下,我建议您使用Factory Pattern, where in you abstractout 数据的实现,让encrypted您只需传入数据,该类处理所有密钥创建、数据加密和漫游密钥存储,然后返回加密数据。
参考: