欢迎各位兄弟 发布技术文章
这里的技术是共享的
在数据库安全中,当涉及到密码的存储时,我们通常不会直接存储密码的明文(即原始文本)。相反,我们会使用一种称为“哈希”的过程来存储密码的“摘要”或“散列”。这里的“摘要”或“散列”是指通过哈希函数处理密码后得到的一个固定长度的输出值。
哈希函数有几个关键特性:
确定性:相同的输入(在这种情况下是密码)总是产生相同的输出(哈希值)。
快速性:计算哈希值应该相对较快。
雪崩效应(也称为“蝴蝶效应”):输入的小变化会导致哈希值的大变化。
单向性:从哈希值逆向推导出原始输入在计算上是非常困难的(或者被认为是不可能的)。
为什么使用哈希而不是直接存储密码?
如果数据库被泄露,攻击者不能直接看到用户的密码。他们只能看到哈希值,而要从哈希值中逆向推导出原始密码是非常困难的。
但是,仅仅使用哈希还不够安全。以下是一些增加安全性的常见做法:
使用盐值(Salt):为每个密码生成一个随机的盐值,并将其与密码一起哈希。这样,即使两个用户有相同的密码,由于盐值的不同,它们的哈希值也会不同。
使用强哈希函数:选择经过时间考验且被广泛认为安全的哈希函数,如bcrypt、Argon2、scrypt等。这些函数通常比传统的MD5或SHA-1等哈希函数更安全。
密钥拉伸:有些哈希函数(如bcrypt)还包括一个“工作因子”或“成本参数”,它决定了哈希计算需要多少迭代。通过增加迭代次数,可以使哈希过程更慢,从而增加暴力破解的难度。
总之,当在数据库中“安全地存储密码的摘要”时,我们实际上是在使用哈希函数来生成密码的哈希值,并将其与(可选的)盐值一起存储。这样,即使数据库被泄露,攻击者也无法直接看到用户的密码。