【问题标题】:Can I store sha256 hashed passwords in plain text?我可以以纯文本形式存储 sha256 哈希密码吗?
【发布时间】:2016-07-26 11:01:59
【问题描述】:

所以我有一个 php 代码,它将密码的散列版本保存到一个名为 passwords.txt 的文件中。按照目前的情况,任何知道文件目录 (www.example.com/datacache/passwords.txt) 的人都可以访问它。这是不正确的做法吗?我以为我按照指南纠正了对字母的密码处理,但这似乎很不安全。想法?有什么建议吗?

谢谢!

【问题讨论】:

标签: php security passwords sha256 password-hash


【解决方案1】:

理想情况下,您应该将它们保存在安全的 SQL 数据库中,或者类似的描述中;散列应该是第二道防线。

因此,如果您的数据库数据遭到破坏并且黑客获得了它,他们将无法登录到每个人的帐户。

通常使用任何类型的哈希的过程是,一旦它被带出,它将是最安全的,然后随着时间的推移,随着人员的聚集和计算机能力的增加,哈希将是通常通过 Rainbow 表的集合“破坏”,最终会出现像 THIS 这样的网站,这就是 Md5 发生的情况。

如果您要将它们存储在 .txt 文件中,除了已经完成的操作之外,您可以做的最低限度是确保您对散列密码进行 SALT。 对散列密码进行加盐可降低其被破解的机会。请参阅下面的链接,了解如何对哈希进行加盐处理。

Great video by Computerphile on YouTube about the topic

Good tutorial by CrackStation on how to Salt a Hash

Good examples by W3Schools on Hashing/Salting

【讨论】:

  • 很好地提到了盐,确保您正确地为每个用户使用随机生成的盐。
  • 是的,忘记添加了。
  • 我不会认为 W3schools 的任何东西都是“好”的,尤其是在安全性方面。破解站文章很棒,尽管作者(Taylor Hornby)现在可能会指向this page
  • 这更像是初学者的一个例子,反对“复制它的标准程序”之类的东西。
【解决方案2】:

这里其实有两个问题:

1) 可以将哈希值存储在文件中吗

将密码保存在文件中并不比将密码存储在数据库中更好或更差。文件的要点是,它应该存储在 WWW 根目录之外。大多数提供者都提供了一个私有目录,可以通过代码访问,但 HTTP 请求无法访问。

2) 使用 SHA-256 对密码进行哈希处理是否安全

不应该直接使用 SHA-* 和 MD5 来散列密码,因为它们太快,因此很容易被暴力破解。相反,应该使用 BCrypt、PBKDF2SCrypt 之类的慢速函数,它们提供成本因素并自动添加安全盐。

PHP 提供a password API 和两个函数password_hash()password_verify()。使用它们,它们是未来的证明,并且会产生 BCrypt 哈希。

// Hash a new password for storing in the database.
// The function automatically generates a cryptographically safe salt.
$hashToStoreInDb = password_hash($password, PASSWORD_DEFAULT);

// Check if the hash of the entered login password, matches the stored hash.
// The salt and the cost factor will be extracted from $existingHashFromDb.
$isPasswordCorrect = password_verify($password, $existingHashFromDb);

如果您运行的是没有此 API 的旧版本 PHP,请升级。如果由于某种原因不能,请查看password_compat

【讨论】:

  • 使用我的主机 (1and1) 提供的私有目录与仅在目录中放置一个 .htaccess 文件来阻止用户之间有区别吗?
  • @kuuy - 你的意思是Deny from all 文件中的Deny from all 命令。在实践中这也是一个很好的解决方案,理论上根目录外的目录更安全一些。 htaccess 方法依赖于正确的配置(您在开发团队中工作吗?)以及服务器软件不能以某种方式被欺骗的假设。根目录外的另一个优点是,密码文件不是版本控制的一部分,并且可以为该目录设置限制性权限。
  • 所以我已经实现了 password_has() 和 password_verify() 命令(需要对 1and1 设置进行一些调整才能切换 PHP 版本)并且一切正常。我也确实是指拒绝所有命令!
猜你喜欢
  • 1970-01-01
  • 2013-10-18
  • 1970-01-01
  • 2020-01-25
  • 2020-03-16
  • 1970-01-01
  • 2011-04-02
  • 1970-01-01
  • 2013-03-24
相关资源
最近更新 更多