【问题标题】:Equivalent of Data Protection API on LinuxLinux 上的数据保护 API 等效项
【发布时间】:2011-08-27 08:01:36
【问题描述】:

Microsoft Windows 2000 和更高版本公开了 Data Protection API (DPAPI),它为每个用户或每个系统的上下文加密数据。调用者不提供用于加密数据的密钥。而是使用从用户或系统凭据派生的密钥对数据进行加密。

此 API 通过 ProtectedData 类方便地在 .NET 中公开:

// Encrypts the data in a specified byte array and returns a byte array
// that contains the encrypted data.
public static byte[] Protect(
    byte[] userData,
    byte[] optionalEntropy,
    DataProtectionScope scope
)

// Decrypts the data in a specified byte array and returns a byte array
// that contains the decrypted data.
public static byte[] Unprotect(
    byte[] encryptedData,
    byte[] optionalEntropy,
    DataProtectionScope scope
)

Linux 上是否有等效的 API? 一个好处是它可以方便地与 Java 集成。

如果没有,我有什么选择?

【问题讨论】:

    标签: java .net windows linux security


    【解决方案1】:

    https://docs.microsoft.com/en-us/aspnet/core/security/data-protection/introduction?view=aspnetcore-5.0

    这里!

    这个文档太好了,我什至不会费心解释更多。 不要因为第一页上没有直接的代码示例而气馁。那里的链接中有示例。适用于所有场景。 DI、ASP.NET、控制台。 Windows 和 Linux。

    正如我之前的其他人所说 - AFAIK 在 Linux 中您没有用户和系统的默认密钥。但钥匙就是钥匙。您可以创建它们,在 Linux 上,您(作为管理员/root)有责任保护密钥文件(这意味着只有授权用户可以访问它们)。

    好处是您不依赖系统特定的键。您只需使用单独的密钥,即您的应用程序密钥。

    如果这是您需要的 - 链接的 API 就是为您准备的。我希望 Linux 内置了用户的默认密钥,但是……这只是增加应用程序级安全性的一个额外步骤。你还想多走一步吗?使用 Azure Key Vault,他们有很好的 REST API,你可以在任何地方使用,不一定在 Dotnet 中。是的,AKV 需要本地存储的用户密码,但您可以远程禁用访问,因此这是一个很好的附加安全层。如果您的用户/机器遭到入侵,您只需禁用该密钥并禁用目标应用程序,直到您为用户提供新密钥。我在敏感的应用程序中经常使用它。作为魅力发挥作用。

    顺便说一句,我使用 Linux DPAPI 的简约示例:

    using System;
    using System.IO;
    
    using Microsoft.AspNetCore.DataProtection;
    
    var keyDirectory = Directory.GetCurrentDirectory();
    var dataProtectionProvider = DataProtectionProvider.Create(new DirectoryInfo(keyDirectory));
    var protector = dataProtectionProvider.CreateProtector("Test");
    var password = "Secret1337";
    var protectedPassword = protector.Protect(password);
    Console.WriteLine($"Protected: {protectedPassword}");
    var decodedPassword = protector.Unprotect(protectedPassword);
    Console.WriteLine($"Decoded: {decodedPassword}");
    

    当然,在现实世界的应用程序中,您不会将密钥存储在当前目录中,但这是我能想到的最简单的示例。

    【讨论】:

      【解决方案2】:

      DPAPI 在 Linux 上不存在。

      Windows 使用特殊的机器 ID 来偏离机器密钥。您可以通过查看读取此密钥的“HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography\MachineGuid”来模拟此行为,并使用您想要的任何加密库来偏离您的特殊密钥。

      另一方面,在 Linux 下,此机器 ID 存储在文件“/etc/machine-id”中。您可以阅读它的内容并从中偏离您的特殊密钥。请注意,在使用快速部署 VM 时,此密钥可能相同。

      使用这个特殊的机器 ID 加密您的数据,它不能被其他机器读取。首先读取机器 ID(Linux 或 Windows),然后尝试解密数据内容。在另一台机器上,结果显然会不同且不正确。

      您可以使用上面的信息编写与平台无关的包装类。

      希望这对将来的人有所帮助。

      干杯

      【讨论】:

        【解决方案3】:

        Linux 上的用户级密钥存储有两种选择:

        这并没有解决对系统级密钥存储的需求。

        【讨论】:

        • -1 因为尽管这些与用户帐户相关联,但它们不是 DPAPI 的 Linux 替代品。见msdn.microsoft.com/en-us/library/ms995355.aspx
        • @rob,您能否详细说明为什么它们不是“DPAPI 的替代品”?它们在架构上可能不同,但它们实现了相同的目标:允许应用程序安全地存储信息,而无需考虑用户身份验证。
        • @RobertChristian dpapi 默认情况下也与用户帐户相关联 - 除非您使用 localmachine 标志,这在任何意义上都不安全。
        【解决方案4】:

        它看起来并不比 PGP 或 Pretty Good Privacy 更先进(或更少)。有可用于 PGP 的 API,我记得其他人善意谈论的 API 是 Bouncy Castle

        这是example of how someone used Bouncy Castle

        可能会提供更好的 API 或解决方案,具体取决于您的具体需求。

        【讨论】:

        • PGP 是否使用用户或系统凭据?据我了解,对于 PGP,您需要提供自己的公钥/私钥对。
        • DPAPI 中的凭证只是一个 RSA 公钥/私钥对,您认为密钥属于谁(系统或用户)是您自己的看法,而不是密钥的函数。
        • @EdwinBuck “因为 DPAPI 专注于为用户提供保护并且需要密码来提供这种保护,所以它在逻辑上使用用户的登录密码进行保护。”这里的问题是您无权访问用户的登录密码,但该功能为您提供了以密码为密钥的加密。这让您不必担心其他用户(甚至是 root)访问您的数据(在 linux 案例中,需要额外注意的是用户当前未登录)。
        猜你喜欢
        • 2018-11-26
        • 2012-11-08
        • 1970-01-01
        • 2010-09-14
        • 2010-09-05
        • 2017-02-11
        • 2011-12-26
        • 1970-01-01
        相关资源
        最近更新 更多