Mar*_*cus 4 .net c# encryption dpapi
我们有一个加密/解密数据的应用程序DataProtectionScope.LocalMachine
.我们现在必须将范围更改为DataProtectionScope.CurrentUser
.
LocalMachine
当范围更改为时,在范围内加密的现有字符串是否仍然可读CurrentUser
,假设用户当然登录到同一台计算机?
编辑:我写了一个非常快速和肮脏的测试应用程序.奇怪的是,在同一台计算机上,我可以通过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);
}
Run Code Online (Sandbox Code Playgroud)
解密DPAPI加密数据时,将忽略数据保护范围.
DPAPI解密例程检查加密blob中的元数据,以查看用于加密的范围,并使用相同的范围进行解密,而不管您指定的范围如何.因此,如果使用计算机作用域对数据进行加密,然后在"使用"用户作用域(在同一台计算机上)对其进行解密,则可以正常工作,因为它仍将使用计算机作用域进行解密.如果要验证,请尝试将使用计算机范围加密的数据移动到其他系统,并使用相同的用户帐户对其进行解密.你会发现这会失败.或者,您可以尝试在使用其他帐户登录时解密这些数据(在这种情况下,它也可以正常工作).
因此,您的问题的答案是:是的,如果您使用具有机器范围的DPAPI加密数据并尝试解密它通过用户范围(在同一台机器上),它将起作用,但仅仅因为它将在解密期间忽略用户范围.