代码之家  ›  专栏  ›  技术社区  ›  Teekin

目前最安全的单向加密算法是什么?

  •  55
  • Teekin  · 技术社区  · 16 年前

    正如许多人所知,单向加密是在数据库中加密用户密码的一种简便方法。这样,即使是数据库管理员也无法知道用户的密码,但必须进行密码猜测,用相同的算法加密,然后将结果与数据库中的加密密码进行比较。这意味着计算密码的过程需要大量的猜测和大量的处理能力。

    鉴于计算机的速度越来越快,数学家们还在开发这些算法,考虑到现代计算能力和加密技术,我想知道哪种算法最安全。

    我已经使用MD5几乎是专门多年了,我想知道是否还有其他事情我应该做。我应该考虑另一种算法吗?

    另一个相关问题:对于这样一个加密的密码,一个字段通常应该有多长时间?我必须承认,我实际上对加密一无所知,但我假设MD5散列(作为一个例子)可能更长,并且可能需要更多的处理能力才能破解。或者,如果加密的密码首先适合,字段的长度是否无关紧要?

    7 回复  |  直到 13 年前
        1
  •  58
  •   Robert Harvey    13 年前

    警告: 自从2010年写下这篇文章以来,GPU已经被广泛地部署到暴力密码散列中。中等价格的GPU 可以运行 一百亿 每秒MD5。这意味着即使是 完全随机的8字符字母数字密码(可能有62个 字符)可以在6小时内被暴力强迫。sha-1只是轻微的 慢一点,需要一天时间。您的用户密码要弱得多,并且 (即使加了盐)每个人的密码都会以数千个的速度下降。 第二。哈希函数是 设计为快速 . 你不想要这个 用于密码。使用scrypt、bcrypt或pbkdf-2。

    MD5 在1996年被发现虚弱,并且 should not be used anymore 用于加密目的。 SHA-1 是常用的替代品,但 has similar problems . 这个 SHA-2 family 哈希函数的 replacement SHA-1。sha-2的成员分别称为sha-224、sha-256、sha-384和sha-512。

    目前,有几个哈希函数 are competing to become SHA-3 下一个标准化的密码散列算法。2012年将选出一名获胜者。这些都不应该使用!

    用于密码哈希 ,您也可以考虑使用 bcrypt . 它设计得足够慢,使得大规模的蛮力攻击不可行。你可以自己调整慢度,这样当电脑变快时,慢度就会变慢。

    警告: Bcrypt是基于一种旧的双向加密算法Blowfish,目前已有更好的替代方案。我不认为BCrypt的加密散列属性被完全理解。如果我错了,有人会纠正我;我从来没有找到从加密角度讨论bcrypt属性(除了其缓慢性)的可靠源。

    密码散列与公钥加密或数字签名相比,碰撞风险对密码散列的影响要小一些,这或许让人安心。今天使用MD5是 terrible idea 对于ssl,但对于密码散列来说不一样是灾难性的。但是如果你有选择的话,就选一个更强壮的。

    使用好的哈希函数是 not enough 以保护您的密码。你应该把密码和 salts 很长,而且 cryptographically random . 如果可能的话,您还应该帮助用户选择更强大的密码或传递短语。越长越好。

        2
  •  10
  •   Matt Solnit    16 年前

    好问题! This page 是一本好书。特别是,作者声称MD5不适合散列密码:

    问题是MD5速度很快。它的现代竞争对手也是如此,比如Sha1和Sha256。速度是现代安全散列的一个设计目标,因为散列几乎是每个密码系统的一个组成部分,并且通常在每个包或每个消息的基础上执行需求。

    在密码散列函数中,速度正是您不想要的。

    文章接着解释了一些替代方案,并建议 Bcrypt 作为“正确的选择”(他的话,不是我的)。

    免责声明:我根本没有尝试过BCRYPT。考虑一下这是一个友好的建议,但我不能用自己的技术经验来支持它。

        3
  •  6
  •   Tony The Lion    16 年前

    为了提高密码强度,您应该使用各种各样的符号。如果密码中有8-10个字符,就很难破解。虽然让它变长会使它更安全,但只有使用数字/字母/其他字符。

    sha1是另一种哈希(单向加密)算法,它速度较慢,但具有更长的摘要。(编码消息)(160位),其中MD5只有128位。

    然后,sha2更安全,但使用更少。

        4
  •  3
  •   David Morrow    16 年前

    加盐密码总是一个额外的防御级别

    $salt = 'asfasdfasdf0a8sdflkjasdfapsdufp';
    $hashed = md5( $userPassword . $salt );
    
        5
  •  3
  •   Seth    16 年前

    看到计算机的速度越来越快,数学家们还在开发这些算法

    RSA加密是安全的,因为它依赖于 坚硬的 影响因素。最终,计算机将以足够快的速度在合理的时间内计算出这个数字。为了保持在曲线的前面,需要使用更大的数字。

    然而,对于大多数网站,哈希密码的目的是使其 不方便 对于有权限读取数据库密码的人,不提供安全性。为此,MD5可以 .

    这里的含义是,如果恶意用户获得了对整个数据库的访问权,他们不需要密码。(前门的锁阻止不了我进窗户。)


    仅仅因为MD5是“坏的”,并不意味着你可以随时逆转它。

        6
  •  1
  •   Ants Aasma    16 年前

    除了作为一个加密安全的单向函数,一个好的密码保护散列函数应该很难暴力-即缓慢的设计。 scrypt 是那个地区最好的之一。从主页:

    我们估计,在现代(2009)硬件上,如果花5秒钟计算派生密钥,对scrypt进行硬件强力攻击的成本大约是对bcrypt(查找相同密码)进行类似攻击的成本的4000倍,比对pbkdf2进行类似攻击的成本高出20000倍。

    也就是说,从常用的散列函数中,对sha家族的任何东西进行几千次迭代都是非常合理的非关键密码保护。

    此外,总是添加一个盐,使它不可能共享的努力,野蛮强迫许多哈希一次。

        7
  •  0
  •   Jeffrey L Whitledge    16 年前

    NIST目前正在进行一项竞赛,以选择一种新的哈希算法,就像他们选择AES加密算法一样。所以这个问题的答案可能会在几年内有所不同。

    你可以查阅提交的资料,自己研究一下,看看是否有你想用的资料。