大多数web应用程序都要求用户通过询问用户名和密码来进行身份验证。他们将用户提供的凭据与数据库中存储的数据进行比较,如果凭据匹配,则授予用户访问权限。听起来不错!但是,如果网站存储密码的数据库遭到破坏,会发生什么? 本文介绍了在数据库中存储密码的各种技术。
根据 赤裸裸的安全 ,55%的网络用户对大多数网站使用相同的密码!这意味着,如果以明文形式存储密码的网站遭到破坏,黑客不仅可以访问你在该网站上的帐户,还可以访问你使用相同密码的所有社交媒体、电子邮件、论坛等帐户! 很多人一定想知道,如果数据库暴露给黑客,那该怎么办?黑客可以访问所有信息。错误的对于黑客来说,从数据库中检索密码的过程有很多种方式会变得很麻烦。即便如此,开发人员也倾向于忽略基本准则,将密码存储在纯文本中。有30%以上的网站以纯文本形式存储密码(包括一些知名网站)。如果网站以明文形式存储您的密码,那么无论您选择的密码有多强,您都不安全! 在数据库中存储纯文本密码是一种罪恶。 有人可能还认为,如果不是纯文本,那么我们必须加密密码,然后存储。这也是一个糟糕的想法。加密函数提供输入和输出之间的一一映射,并且它们总是可逆的。如果黑客得到了密钥,他将能够解密密码。更好的方法是使用单向加密哈希函数。散列函数提供了输入和输出之间的多个映射,实际上不可能反转输出。一个好的加密哈希函数具有较少的 碰撞 (即,对于函数的不同输入值,很难获得相同的输出)。碰撞无法完全避免,因为 鸽子洞原理 我们可以为两个哈希函数生成唯一的密码。 一些流行的加密哈希函数是 MD5 和 沙1 。一种方法是存储密码的哈希值,而不是在数据库中存储纯文本密码。你可能会想,如果我们无法从散列中获取实际密码,那么我们将如何验证用户输入的凭据?很简单,对用户输入的密码应用相同的哈希函数,然后将其与存储在数据库中的哈希进行比较。如果两个哈希值都匹配,则对用户进行身份验证(因为相同输入的哈希值将给出相同的输出)。现在,如果攻击者能够访问数据库,他将只能查看哈希输出,而不能查看实际密码。 使用加密哈希函数比存储纯文本密码要好 . 黑客是聪明人,一旦他们知道开发人员正在存储散列密码,他们就会预先计算大量单词的散列(来自流行单词列表或字典单词)。他们创建了一个单词表和相应的哈希表。这张桌子被称为 彩虹桌 而且它在网上很容易买到。他们可以使用此表通过比较从数据库获得的哈希值来反向查找实际密码。因此,拥有一个 强密码 因为你的密码出现在单词列表中的可能性变小了。
简单地存储密码的散列将不再有用。随着GPU和CUDA、OpenCL库的引入,处理能力大幅提高。一个快速的GPU可以在一秒钟内生成数百万个MD5/SHA1哈希。因此,黑客可以通过强制执行各种可能的组合,轻松生成大量哈希,并将其与存储在数据库中的哈希进行比较,以提取实际密码。
即使是散列密码也不安全!惊讶 不要失去希望!开发者仍然可以做一些事情,让你的密码远离黑客的窥探。在密码中加入一些盐,使其美味可口!是的,对。。!添加一个 盐 salt是随机数据,在将其作为哈希函数的输入发送之前,它与密码连接在一起。 例如 : 如果你的密码是 abc 盐是 !ZaP0#8 ,这是 hashFunction(’abc!ZaP0#8’) 将存储在数据库中,而不是 hashFunction(’abc’) . 因此,彩虹表攻击现在不会有效,因为彩虹表包含 “abc!ZaP0#8′ 是贫乏的(因为通常彩虹表是由常用词、字典词等构成的)。Salt不存储在数据库中,只存在于外部世界无法访问的应用程序配置文件中。获得对源文件的访问权限比获得对数据库的访问权限要困难。 上述腌制方法是静态的。我们有一个固定的密码。要对用户进行身份验证,首先将固定salt连接到用户提供的输入(密码),然后将值传递给哈希函数,并将其与存储在数据库中的值进行比较。然而,这种方法仍然容易受到暴力的攻击,如果攻击者能够获得静态salt,他可以通过在每个单词中连接salt来使用旧的攻击方法。 更好的方法是使用动态盐。对于每个用户,一个新的salt由加密强随机字符串生成器生成。用户输入的密码与随机生成的salt以及静态salt连接在一起。连接的字符串作为哈希函数的输入传递。所得结果存储在数据库中。动态salt需要存储在数据库中,因为它对于不同的用户是不同的。在对用户进行身份验证时,首先从数据库中获取该用户的动态salt值,并将其与用户提供的输入和静态salt连接起来。将结果与数据库中存储的哈希进行比较。 如果数据库遭到破坏,黑客不仅会得到你的密码哈希,还会得到使用的动态salt。您可能想知道,如果攻击者有动态盐,那么动态盐比静态盐有什么优势?即使攻击者拥有动态salt,他也需要为数据库中的每个用户创建一个新的哈希表(或彩虹表)(根据动态salt)。这比为所有用户创建一个表要昂贵得多。 上述方法非常有助于减缓黑客的速度。但是,建议使用以下算法: bcrypt 和 咆哮 而不是MD5/SHA1。Bcrypt是一种基于河豚的哈希算法。它要求您指定成本/工时系数。工时因素使整个过程变慢,因此生成哈希表所需的时间将增加数倍。 参考资料: https://nakedsecurity.sophos.com/2013/11/20/serious-security-how-to-store-your-users-passwords-safely/
本文由 萨凯特·库马尔 .如果你喜欢GeekSforgek,并想贡献自己的力量,你也可以使用 贡献极客。组织 或者把你的文章寄到contribute@geeksforgeeks.org.看到你的文章出现在Geeksforgeks主页上,并帮助其他极客。
如果您发现任何不正确的地方,或者您想分享有关上述主题的更多信息,请写下评论。