4

我们有一个应用程序将数据加密/解密为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);
    }
4

1 回答 1

9

解密 DPAPI 加密的数据时,将忽略数据保护范围。

DPAPI 解密例程检查加密 blob 中的元数据,以查看用于加密的范围并使用相同的范围进行解密,而不管您指定的范围如何。因此,如果您使用机器范围加密数据,然后“使用”用户范围(在同一台机器上)对其进行解密,它将起作用,因为它仍将使用机器范围进行解密。如果要验证,请尝试将使用机器范围加密的数据移动到不同的系统并使用相同的用户帐户对其进行解密。你会看到这会失败。或者您可以尝试在使用其他帐户登录时解密这些数据(在这种情况下,它也可以工作)。

因此,您的问题的答案是:是的,如果您使用具有机器范围的 DPAPI 加密数据并尝试通过用户范围(在同一台机器上)对其进行解密,它将起作用,但只是因为它会在解密期间忽略用户范围.

于 2013-11-23T05:26:36.133 回答