【问题标题】:Data Protection API Scope: LocalMachine & CurrentUser数据保护 API 范围:LocalMachine 和 CurrentUser
【发布时间】:2013-10-03 16:56:46
【问题描述】:

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

【问题讨论】:

    标签: c# .net encryption dpapi


    【解决方案1】:

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

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

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

    【讨论】:

    • @Alex Davis 加密本地机器范围内的数据涉及哪些参数?不涉及密码吗?使用逆向工具破解 localmachine blob 有多容易?请指教
    • @techno:CryptProtectData 和 CryptUnprotectData 的 API 定义中描述了这些参数。请参阅obviex.com/samples/dpapi.aspx 的示例。我不确定密钥使用哪个密码(密码),可能是受 LSA 保护的某个值。通过在机器上运行恶意程序而不是逆向工程(我在这里推测),本地机器选项更容易破解。一般来说,我不建议使用机器范围。
    • 感谢您的回复。我不是在寻找防故障机制。我认为即使我使用本地机器范围,也需要大量的技术技能才能找到秘密。加上额外的熵我会使用只有应用程序知道的秘密。你怎么看?
    • @duct_tape_coder:我没有看到任何关于微软内部如何做的细节,但是用户上下文在密码更改后工作。唯一一次中断是本地(而非域)帐户的密码被管理员重置。
    • @AlekDavis 这有点旧但内容丰富:support.microsoft.com/en-us/help/309408/… 另外值得注意的是使用 DPAPI 的风险:harmj0y.net/blog/redteaming/…
    猜你喜欢
    • 2015-04-19
    • 2021-04-03
    • 1970-01-01
    • 2011-01-06
    • 2012-10-31
    • 2014-10-05
    • 2021-11-14
    • 1970-01-01
    • 2022-11-24
    相关资源
    最近更新 更多