当前位置: 首页 > 面试题库 >

如何在MySQL中安全地存储用户的密码和盐?

贲宜春
2023-03-14
问题内容

因此,我在SO上发现应该将密码和“
salt”一起散列。(可在此处和此处找到文章。)

这是代码

$password = 'fish';

/* should be "unique" for every user? */
$salt= "ABC09";

$site_key = 'static_site_key';

hash_hmac('sha1', $password . $salt, $site_key);

现在,我需要同时将$password和和保存$salt在MySQL中,如下所示:

+---------+--------+----------+-------+
| user_id |  name  | password |  salt |
+---------+--------+----------+-------+
|    1    | krysis |  fish**  | ABC09 |
+---------+--------+----------+-------+

** fish当然会被散列,而不是以纯文本形式存储。

我只是想知道以这种方式进行操作实际上是否有意义,因为通过这种方式,黑客或其他任何人也都可以理解吗?因此,如果他们破解了密码并且看到了密码,fishABC09他们会自动知道密码是fish?还是因为他不知道密码(因为密码secret_key未存储在数据库中)而使他“永远”无法破解密码?

如果我没有任何道理,对不起。我只是一直使用sha1密码,今天我找到了这些文章,这些文章讨论了添加salt


问题答案:

有关于正确存储密码的好文章。例如:存储密码-做对了!

您应该为每个用户使用不同的盐,但是无需单独存储盐。在另一个线程中查看类似的讨论

顺便说一句,您可能不应该使用sha1,而应该使用诸如sha256或sha512之类的更强的东西(至少是为了避免不好的宣传)。关于此问题,有一个很好的答案:盐腌的SHA1与盐腌的SHA512相比有多不安全



 类似资料:
  • 问题内容: 我想知道如何在Android中安全存储 加密密钥 吗?保护加密和秘密密钥的最佳方案是什么? 问题答案: 根据您的评论,您需要使用适用于当前Android版本和旧Android版本的本地密钥对数据进行加密 Android Keystore 旨在生成和保护您的密钥。但是它不适用于18级以下的API级别,并且在API 23级之前有一些限制。 您将需要一个随机对称加密密钥,例如AES。AES密

  • 问题内容: 我们基于Web的应用程序使用在帐户创建期间指定的密码将用户帐户绑定到用户。对于Java,在将密码的哈希值保留在数据库中之前,如何安全地处理密码。 更具体地说,如何确保在足够短的时间间隔内对收集密码的字符串进行垃圾回收? 问题答案: 如果有可能(在Web应用程序中可能很困难),将密码存储在字符数组中比将其存储在字符串中更好。如果完成了密码的存储,则可以使用Array.fill()将其覆盖

  • 问题内容: 我在工作场所使用Git,并且公司政策不允许我以不安全的方式存储密码。有没有比将密码存储到Git服务器更好的选择了? PS无法使用密钥验证,因为我们的服务器不允许使用密钥验证。 问题答案: 不是很安全;如文档中所说: 使用此帮助程序会将密码未加密地存储在磁盘上,仅受文件系统权限保护 〜/ .git-credentials文件将设置其文件系统权限,以防止系统上的其他用户读取它,但不会被加密

  • 在一个应用程序中,我使用Android密钥库。我已经为整个密钥库和每个密码条目设置了密码。因为这些密码是字符串,所以它们存储在代码的字符串成员中。 显然,如果我想发布应用程序,这是不安全的,因为潜在的攻击者可以反编译apk并获取密码,因为它是硬编码在应用程序中的。 我的问题是: 在上面的场景中:攻击者是否能够读取我的密钥库文件,或者(在无根手机上)该文件是否只能由我的应用程序访问,因此仅密码是不够

  • 我将使用oAuth从谷歌获取邮件和联系人。我不想每次都要求用户登录以获取访问令牌和密码。据我所知,我需要将它们与应用程序一起存储在数据库或中。但我有点担心安全问题。我了解到,你可以加密和解密令牌,但攻击者只需反编译你的apk和类并获取加密密钥就很容易了 在Android中安全存储这些代币的最佳方法是什么?

  • 我在工作场所使用Git,公司政策不允许我以不安全的方式存储密码。有没有比使用