我将为我的用户生成一个随机密码。可能我会使用salt和sha1方法。但是我发现还有sha1的其他版本,比如sha256,sha512等。
sha版本之间有什么区别?哪一个更好,更安全,更快(性能)?我应该使用哪一个?
编辑:
我是php用户,谢谢:)
答案 0 :(得分:3)
密码生成并不像您想象的那么简单。例如,如果您为可以通过手机(或任何只有数字键盘的设备)访问的站点生成密码,则应确保密码中没有两个连续的字符在同一个密钥上,因为那样是一个巨大的UI漏洞。
示例:将dfe4Pl7
视为密码。为了输入它,使用者应该按3
一次,而不是等待,然后按3
三次,然后再等一次再按'3'两次。这很糟糕。
更一般地说,应该生成密码,以便尽可能避免误解。例如,我个人避免包括1
和l
,0
和O
等。
底线是:哈希算法在这里会有一些帮助。你需要的是一个好的随机数生成器和一个UI方式的实体生成算法。
答案 1 :(得分:3)
你在这里混淆了两个问题。随机密码生成,基本上是挑选一定(最小)长度的随机符号,以及密码存储,实际上涉及用盐存储密码的散列,以便只通过阅读明文密码就无法发现数据库中。
要选择随机符号,您有一个包含所有符号的数组,使用该数字作为索引获取一个随机数和下标到数组中以返回符号。这就是凯恩沃尔曼早些时候提出的建议。但是,对于密码生成等安全相关的应用程序,需要cryptographically strong伪随机数生成,即rand()is not。
如前所述,密码不应以明文形式存储在数据库中。否则,任何有权访问它的人都可以阅读它并知道任何和所有特定用户密码的密码。发生的是密码的哈希是存储而不是存储。当用户尝试登录时,他们的密码是哈希值,并与数据库中的值进行比较,以查看它是否相同。散列函数就是所谓的单向函数。您可以对密码进行散列以获取散列值,但是如果不尝试所有可能的组合以查看它是否匹配,则无法从散列值中获取密码。 (至少,这是个主意。)当然,它比当然更复杂,因为哈希值输出是固定长度,而实际上可能的输入不是无限的,肯定超过了可能的输出数量。
现在,盐的来源是因为单独密码的简单散列也不安全。首先,这样的方法将为具有相同密码的任何两个用户提供相同的散列值。一个帐户的妥协将导致另一个帐户的妥协。其次,攻击者可以做的是提前构建所谓的rainbow table。虽然这需要时间,但只需要对任何存储算法执行一次,并且他或她不必自己完成。这项工作可以通过许多计算机进行,事实上,互联网上的网站可以为弱密码哈希系统下载这些彩虹表,例如LM和NTLM。之后,攻击者可以只查找表中的任何特定哈希值并确定明文密码。因此,为了防止这种情况,在密码被散列之前,会在密码中添加一个随机(每用户)的salt值。这使得即使对于相同的密码输入也不同,因此防止出现第一个问题。如果盐和盐,它还可以减轻第二个问题。密码组合足够长,因为输入的长度使得强制它在计算上是不可行的。
关于使用哪种特定SHA或其他哈希算法的问题。 SHA是美国NIST的标准,并且被认为是相当不错的。 SHA-1有一点理论上的突破,但在实践中它仍然足够安全用于大多数目的。 SHA-2算法优于SHA-1,没有已知的突破。选择哪种变体可归结为各种尺寸,包括尺寸。它们产生不同长度的输出,并且由于尺寸差异而计算的数量不同。在许多其他散列算法中,PHP有native implementation个SHA-1,SHA-256,384和512。
毕竟,在实践中,您选择的哪种SHA算法可能并不重要,因为系统中的弱点可能在其他地方。用户写下他们的密码。用户在不同系统中使用相同的密码。编程缺陷允许XSS和SQL injection之类的内容。等等。
答案 2 :(得分:1)
如果您只是使用密码来创建随机字母和数字,则加密算法安全性并不意味着什么。你最好做一个随机密码功能,它会更有效率....你为什么还要腌制?
这是一个用PHP编写的SIMPLE密码生成器。
function RandomPassword( $length )
{
$characters = "abcdefghjklmnpqrstuvwxyz23456789";
$result = "";
for( $i=0; $i < $length; $i++ )
{
$result .= $characters[ rand( 0, strlen( $characters )-1 ) ];
}
return $result;
}
注意:i,1,0和o故意丢失,因为它们很容易被误认为对方。
答案 3 :(得分:0)