gpt4 book ai didi

php - 将散列密码存储到 Mysql

转载 作者:行者123 更新时间:2023-11-30 23:58:17 24 4
gpt4 key购买 nike

我正在研究在 PHP.NET 上对数据库进行哈希处理和存储密码。这个网站说:

例如,如果您将数据存储在 MySQL 数据库中,请记住 varchar 字段在插入过程中会自动删除尾随空格。由于加密数据可以以空格 (ASCII 32) 结尾,因此删除会损坏数据。而是将数据存储在 tinyblob/tinytext(或更大)字段中。

哪个建议更好?或者我可能不得不问:其中一个更好吗?如果答案是肯定的,哪个?最后我应该如何使用 PDO 将密码存储到数据库。我以为我可以像文件一样将信息写入 blob 行,但是如果我从输入中获取值,必须使用哪个方法或函数?请解释一下好吗?

最佳答案

存储散列密码时,删除空格不是问题:

  • 您从不存储密码本身,而是存储哈希函数的输出。
  • 此散列函数产生固定大小的输出(或者您可能使用可逆的加密算法)。
  • 大多数哈希函数的输出已经是固定大小的明文[1],不包含任何空格。否则,您可能正在使用不适用于密码哈希的哈希函数。
  • 固定大小的salt与散列输出一起存储(密码散列函数知道加盐通常输出带有散列密码的盐)。
  • 如果你想灵活一点,以后能够升级到更好的哈希函数,你还得记住用的是哪个哈希函数。建议使用纯文本[1] 来获取此信息,这使得完整的记录可变长度。 RFC 2307描述了这样一个可能的明文[1]存储方案。

密码应使用经过验证的现代 key-stretching 进行哈希处理算法,但不适用于 SHA-256 或 MD5 等加密哈希函数。合适的算法包括 PBKDF2 , bcrypt , 或 scrypt .

例如,使用 bcrypt 和新盐对字符串“pass phrase”进行散列处理可能会产生

$2a$12$PuYHvYwgKeD.hQ1Dv6nLQuxUkv5zP3lYLPHqdMOzgwPVaGGSAs07u
`-----'`-----------······· ·········-------'
algorithm random salt password hash
parameters

整个字符串都可以用作盐,因为实际的密码哈希将被截断而不用作盐。

验证登录尝试的推荐工作流程:

  1. 用户提供用户名和密码。小心处理 Unicode 规范化和编码。
  2. 哈希密码是根据用户名从数据库中获取的。
  3. 解析散列密码以确定使用的算法。
  4. 以用户密码作为输入并以散列密码作为盐来调用正确的算法。
  5. 如果两个哈希匹配,则用户提供了正确的密码。

设置新密码的推荐工作流程:

  1. 如果用户已经存在,则验证他。
  2. 从用户那里获取新密码。注意处理 Unicode 规范化和编码。就密码的强度向用户提供反馈(但不要用禁止使用的字符或限制最大长度等愚蠢的要求让用户感到沮丧)。
  3. 创建一个新的 salt,它不能依赖于用户输入,例如密码或用户名。
  4. 选择一个强大的密码哈希函数,并使用新盐对密码进行哈希处理。
  5. 更新数据库以存储新密码以及哈希函数的标识符。

进一步评论:

  • 加密数据是二进制数据,不应存储为文本(改为使用 blob)。
  • 哈希通常表示为纯文本而不是二进制数据,因为文本更易于存储。
  • 在许多情况下,您可以使用 OpenID而不是实现您自己的身份验证。例如。 Stack Exchange 提供使用 OpenID 登录。因为我使用了这个选项,所以我从来不必向 SE 透露密码。
  • 我没有密码学背景。 Information Security经常光顾由更了解此事的人提供。

[1] 此处,“明文”表示可打印的 ASCII 字符。它不是指密码的明文。

关于php - 将散列密码存储到 Mysql,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20462411/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com