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