数据保护API范围:本地机器和当前用户
本文关键字:用户 机器 API 范围 数据保护 | 更新日期: 2023-09-27 18:33:42
我们有一个应用程序,可以加密/解密数据作为DataProtectionScope.LocalMachine
。我们现在必须将范围更改为 DataProtectionScope.CurrentUser
.
当范围更改为 CurrentUser
时,在 LocalMachine
作用域下加密的现有字符串是否仍然可读,当然假设用户登录到同一台机器?
编辑:我写了一个非常快速和肮脏的测试应用程序。奇怪的是,在同一台计算机上,我可以解密在LocalMachine或CurrentUser作用域下通过LocalMachine和CurrentUser作用域加密的字符串。这听起来不像正确的行为,救命!
private void btnUserEncrypt_Click(object sender, EventArgs e)
{
//encrypt data
var data = Encoding.Unicode.GetBytes(txtUserEncrypt.Text);
byte[] encrypted = ProtectedData.Protect(data, null, DataProtectionScope.CurrentUser);
txtUserEncrypt.Text = Convert.ToBase64String(encrypted);
}
private void btnUserDecrypt_Click(object sender, EventArgs e)
{
byte[] data = Convert.FromBase64String(txtUserDecrypt.Text);
//decrypt data
byte[] decrypted = ProtectedData.Unprotect(data, null, DataProtectionScope.CurrentUser);
txtUserDecrypt.Text = Encoding.Unicode.GetString(decrypted);
}
private void btnMachineEncrypt_Click(object sender, EventArgs e)
{
//encrypt data
var data = Encoding.Unicode.GetBytes(txtMachineEncrypt.Text);
byte[] encrypted = ProtectedData.Protect(data, null, DataProtectionScope.LocalMachine);
txtMachineEncrypt.Text = Convert.ToBase64String(encrypted);
}
private void btnMachineDecrypt_Click(object sender, EventArgs e)
{
byte[] data = Convert.FromBase64String(txtMachineDecrypt.Text);
//decrypt data
byte[] decrypted = ProtectedData.Unprotect(data, null, DataProtectionScope.LocalMachine);
txtMachineDecrypt.Text = Encoding.Unicode.GetString(decrypted);
}
解密 DPAPI 加密的数据时,将忽略数据保护范围。
DPAPI 解密例程检查加密 blob 中的元数据,以查看用于加密的范围,并使用相同的范围进行解密,而不考虑指定的范围。因此,如果您使用计算机作用域加密数据,但随后"使用"用户作用域(在同一台计算机上(对其进行解密,它将起作用,因为它仍将使用计算机作用域进行解密。如果要进行验证,请尝试将使用计算机范围加密的数据移动到其他系统,并使用相同的用户帐户对其进行解密。您将看到这将失败。或者,您可以尝试在其他帐户下登录时解密这些数据(在这种情况下,它也可以工作(。
因此,您的问题的答案是:是的,如果您使用具有计算机作用域的 DPAPI 加密数据并尝试通过用户作用域(在同一台计算机上(对其进行解密,它将起作用,但只是因为它会在解密过程中忽略用户作用域。