我知道“如何安全地存储密码?”问题在这里被问了很多次;我知道答案总是“永远不要这样做!存储哈希值,永远不要存储密码!使用 bcrypt!”
但是当您不能使用散列进行身份验证时怎么办?例如:自动化流程。假设我编写了一个自动化应用程序,需要登录 SFTP 站点或某种需要用户名/密码的外部服务。我无法使用散列对外部服务进行身份验证,那我该怎么办?
我用 C#
和 ASP.NET
标记了这个问题,因为这是这个问题特别适用于我的情况的两个领域。
编辑:由于评论中提出的讨论,让我澄清一下我试图解决的威胁:我想防止攻击者能够读取用于访问外部服务。这意味着,如果他们以某种方式获得了对我们的网络或数据库的非管理员访问权限,即使使用数据库转储,他们也无法读取纯文本密码。
最佳答案
有不同的选择,既可以使用 key 对密码进行加密,也可以使用 HSM 模块保护 key 存储。
选项 (1):将数据库与 HSM 模块一起使用
您可以将加密的密码存储在数据库中,并受益于 SQL 2016“始终加密(数据库引擎)”中的一项功能。 Always Encrypted 允许客户端加密客户端应用程序内的敏感数据,并且永远不会向数据库引擎(SQL 数据库或 SQL Server)泄露加密 key 。
您可以将硬件安全模块 (HSM) 与 Always Encrypted 结合使用。
硬件安全模块 (HSM) 是保护数字 key 并执行加密操作的物理设备。这些模块传统上以插入卡或直接连接到计算机或网络的外部设备的形式出现。
当您获得 HSM 时,您还会获得一个实现通用 API 的软件库,例如 Microsoft Crypto API 和 Cryptography API。这些 API 称为加密服务提供程序 (CSP) 和加密 API:下一代 CNG 提供程序。
您的应用程序可以使用这些 API 与 HSM 通信。
为了更加保护 HSM 模块,您可以: - 将 HSM 绑定(bind)到您的数据库服务器。 - 将 HSM 绑定(bind)到操作系统服务器的管理员登录名。
更多详情:
Always Encrypted (Database Engine) Using Hardware Security Modules with Always Encrypted
此外,Oracle 数据库和其他引擎可以使用 HSM 提供加密
Securing Stored Data Using Transparent Data Encryption
选项 (2):使用 HSM 模块将密码存储在 protected 存储中的文件中:
加密包含密码的文件。这可以通过操作系统、应用程序或专用实用程序(例如专门设计用于保护密码 secret 性的密码管理软件)来完成。
使用操作系统访问控制功能来限制对包含密码的文件的访问。例如,可以将主机配置为仅允许管理员和某些以管理员级别权限运行的进程访问密码文件,从而防止用户和用户级别进程访问密码。
- 由于您没有使用散列,我排除了这个选项,但它是一种存储密码的单向加密散列而不是存储密码本身的机制。
关于c# - 为自动化存储密码的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39251648/