加密密码超过md5有什么意义吗?

时间:2009-11-17 18:13:38

标签: security encryption cryptography md5

我不是安全专家......所以我在这里可能会非常错误。

我是否正确使用更强大的算法的唯一好处是减慢密码破解?

在这种情况下,他们必须拥有密码哈希,所以我的数据库已经完全正确吗?

由于我没有存储真实世界价值的东西,使用强密码算法有什么意义?如果他们已经在我的数据库中,他们可以更改他们想要的任何内容,为什么他们想要密码?

我能看到的唯一原因是减慢暴力破解并保护我的用户密码,以防他们在电子邮件帐户中使用相同的密码...

我已经实施了SHA256 ......但我想知道它是否值得

8 个答案:

答案 0 :(得分:13)

MD5不是加密,它是单向哈希。

使用更好的单向散列的唯一目的是延迟反转密码。随着计算机变得越来越强大,各种散列算法中的漏洞被发现,必须开发更好的散列。

  

在这种情况下,他们必须拥有   密码哈希等已经存在   我的数据库是否正确?

salting和hashing密码的目的是保护密码本身,即使在数据库受到损害的情况下也是如此。许多(大多数)用户使用相同的密码进行多次登录,因此如果它被泄露,那么它所链接的每个帐户都会被泄露。

SHA-256应该绰绰有余,但要确保你也对salowrd进行了腌制。你的函数应该是这样的(伪代码):

fun store_password(plaintext):
    salt = random_alphanumeric(40) # maybe put 40 in a config, or #define somewhere
    hashed = sha256_digest(salt + plaintext)
    return "sha256!" + salt + "!" + hashed

fun check_password(plaintext, stored):
    algo, salt, hashed = stored.split("!")
    if algo == "sha256"
        return (sha256_digest(salt + plaintext) == hashed)
    else if ... # other supported password schemes here

下面的一位评论者指出,如果有足够强大的攻击者(或弱密码),那么存储完整的盐可能会使明文被暴力强制。如果您对此感到担心,请使用两份盐。每次生成部分内容(saltA),并将另一个存储在配置文件(saltB)中。然后将它们组合起来生成/检查密码:

import my_config

fun store_password(plaintext):
    saltA = random_alphanumeric(40)
    hashed = sha256_digest(saltA + my_config.saltB + plaintext)
    return "sha256!" + saltA + "!" + hashed

fun check_password(plaintext, stored):
    algo, saltA, hashed = stored.split("!")
    if algo == "sha256"
        return (sha256_digest(saltA + my_config.saltB + plaintext) == hashed)
    # ...

请注意,如果您选择此系统,则更改saltB将使每个存储的密码无效。

答案 1 :(得分:4)

杰夫有一篇名为You're Probably Storing Passwords Incorrectly的精彩帖子,解决了围绕此类密码存储的问题。强烈推荐阅读。

答案 2 :(得分:2)

是。如果某人使用您的密码获取您的数据库,使用比MD5更强大的东西会降低他们对整个事情进行字典攻击的能力。您需要做的非常重要的事情是提高安全性的突飞猛进,就是在对密码进行散列之前为密码添加一个盐。

基本上你应该阅读与你在http://www.owasp.org尝试做的相关的所有内容,然后将其关注到T,除非你把自己算作安全研究员。

答案 3 :(得分:2)

Don't use MD5用于加密目的 - 它已损坏!使用您实现的SHA256,或者更好的广泛测试的库(我打赌您在实现中错过了许多安全问题)。

BTW:构建加密哈希函数,使您无法解码初始文本。加密始终只有在您知道密码时才能恢复原始文本。

答案 4 :(得分:2)

使用更强大的算法可能是值得的。

首先,大多数MD5用户可能正在使用经过测试和审核的库。很多这些库都是免费且开源的。其中大部分也会提供SHA-1,甚至可能是SHA-2算法。

因此,使用SHA-1或SHA-256的“成本”可能非常小。

另一方面,价值是多少?即使应用程序可能不包含太多重要数据,并且密码表的妥协可能仍包括其余数据,但有助于记住大多数密码用于多个应用程序。即使用户可能不关心您的应用程序是否被黑客入侵,如果黑客能够访问他们也用于银行业务的密码,他们也会感到不安。

我认为值得升级到更好的哈希算法。

此外,放弃MD5而转向支持SHA-1或SHA-256的动机是MD5被“破坏”。有快捷方式可以找到哈希冲突,因此不需要暴力破解。要减缓蛮力攻击,您还需要使用密钥加强技术。通常,这意味着重复哈希操作几千次。您还需要使用随机盐来阻止预先计算的查找表,例如彩虹表。

当然,像PKCS#5中的密钥派生算法这样的算法详细说明了一种“哈希”认证表密码的安全方法。使用这样的标准可以让您访问所选技术的高质量分析,并提醒您潜在的漏洞。您也更有可能找到已经过广泛审核和测试的实现。

答案 5 :(得分:1)

是的,建议使用SHA-256作为密码。事实上,对于安全的美国政府软件,它是由NIST从{2010年开始的mandated

有关由FIPS验证的免费开源加密库,请参阅http://www.openssl.org/。它实现了消息摘要算法,包括SHA-2系列。

对于MD5,SHA-1和其他强度较低的散列算法,仍有合法用途,但建议不要使用散列密码。

答案 6 :(得分:0)

如果密码以任何未加密的方式越过网络(例如,它是在非SSL服务器上运行的Web应用程序的密码),那么他们不一定能访问您的数据库,只需访问有线流量。因此,在这种情况下,您需要确保密码受到保护,因为您可以在合理范围内使用密码,因此使用比MD5更强大的密码。

答案 7 :(得分:0)

如果您强制执行更好的密码,它将在不更改算法的情况下完成工作。 md5不应该是可逆的,至少不是一个想成为新手的“黑客”。使用好的密码(超过12个字符并同时使用数字,大写字母和小写字母)将比改变算法做得更好。

@John Millikin对使用密码进行腌制有好处 - 这比仅执行良好的密码更好。