在哪里存储用于加密和解密密码的密钥?

3
我有一个存储登录信息的表,例如loginID、密码、logTime等。我创建了两个存储过程:一个用于加密,另一个用于比较密码。加密和比较密码需要一个密钥。我想知道应该把密钥放在哪里。如果我把它放在存储过程或应用程序中,我的开发团队将能够看到它。我想知道保留密钥的最佳实践。请给予建议。
谢谢。

在SO上已经有几个关于这个主题的问题了... - Mitch Wheat
2个回答

6
有许多用例需要存储认证凭据,每个用例都需要不同的解决方案:
如果凭据是用于用户登录您的系统,则最佳做法是根本不存储密码。而是创建密码的单向加密哈希,并将其存储。当用户尝试登录时,请对提供的密码进行哈希处理并将结果与存储的哈希进行比较。哈希应包括每次用户更改密码时更改的“盐”。这使得如果有人成功窃取了系统的哈希密码文件,他们很难应用暴力攻击来反转哈希代码。
如果凭据是用于用户登录第三方系统,则可以为登录到您的系统的用户生成一个不同的密码单向哈希,并将其用作对称密码器的密钥,以加密/解密存储的用户凭据。再次强调的核心原则是存储解密用户凭据所需的信息。在这种情况下,不应存储用作密钥的哈希。
如果凭据是用于系统向其他系统进行身份验证,则通常的解决方案是使用密钥库,并依赖主机操作系统来保护它和用于解锁它的密钥短语。(如果有更好的解决方案,我会非常感兴趣!)
明文或加密存储用户密码是一个坏主意,因为总有可能有人会闯入并窃取它们。即使密码已加密,解密密钥也必须存储在某个地方。一个决心强大的黑客可能会找到它。或者,可信任的管理员可能会被说服透露密码和/或解密密钥。通过存储哈希而不是密码,即使您的数据库和/或应用程序的密钥库受到攻击,您也具有额外的保护程度。
等式的第二部分是许多用户在许多系统中使用相同的密码。因此,如果您的系统被攻破以显示密码,则可能会暴露用户在其他系统上的帐户。

2

你需要对密码进行哈希而不是加密。这样就不需要任何密钥。

无论你将密码存储在哪里,它最终都可以被找到。所以如果你想要将其隐藏不让其他开发者看到,那是行不通的。


Sambath:不完全是这样。哈希密码通常会进行“加盐”,这意味着在使用某些加密哈希函数(如sha1)对密码进行哈希之前,您需要将一个随机前缀(称为盐)添加到密码中。然后,您将盐(明文)与哈希的盐+密码一起存储。这使得对于想要进行暴力破解或字典攻击的人来说更加困难。 - Laurence Gonsalves
不要用SHA1,使用更强的加密算法。 - Yuriy Faktorovich

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接