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

Mar*_*ark 2 security encryption md5 cryptography

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

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

在这种情况下,他们必须有密码哈希,所以已经完成了我的数据库的权利吗?

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

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

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

Joh*_*kin 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
Run Code Online (Sandbox Code Playgroud)

下面的评论者指出,如果有足够强大的攻击者(或弱密码),存储完整的盐可能会使明文被暴力强制.如果您对此感到担心,请使用两份盐.每次生成一部分(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)
    # ...
Run Code Online (Sandbox Code Playgroud)

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

  • delfuego:那不是真的 - 盐可以防止预先计算出的哈希表(也就是"彩虹表").通过在存储之前用足够长的盐盐密码,它会迫使攻击者使用暴力攻击.假设用户没有使用"123"或"密码"作为密码,它应该是非常安全的. (8认同)
  • salt有助于防止彩虹表攻击,因为哈希将是密码唯一的. (2认同)