【问题标题】:in postgres, which has only md5 encryption, what is best way to save password?在只有 md5 加密的 postgres 中,保存密码的最佳方法是什么?
【发布时间】:2012-01-29 00:37:52
【问题描述】:

PostgreSQL 只有 MD5 用于加密存储密码。

从阅读黑客日志来看,单独使用 MD5 似乎不是一种非常安全的密码存储方式。

我一直在使用 MD5 的 MD5 — 一次在客户端使用 MD5,然后在数据库再次使用 MD5 — 但我不知道这会更强大。

首先,是否有必要加强存储密码?其次,什么是简单、有效、跨语言的方法?

【问题讨论】:

  • 投票结束:您介意解释一下您的理由吗?
  • 存储过程的广泛使用,因此传统上在移植到应用程序级别之前在 db 级别测试所有内容。也许你是对的——也许我的方法让我对显而易见的事情视而不见。
  • 当然,你也可以使用pgcrypto:postgresql.org/docs/8.3/static/pgcrypto.html……但如果是我,我只会在应用程序级别这样做:)
  • pgcrypto - 也由 @plundra 链接 - 看起来很棒。我个人感觉更好的是,无论应用程序错误如何,数据库都会始终加密敏感信息,但是将所有应用程序代码放在一个地方也很有意义。
  • MD5 不是一种加密方法;请注意此处使用的术语,可能会导致误解

标签: security postgresql encryption passwords


【解决方案1】:

安装pgcrypto 扩展为您提供了一套功能和工具供您使用。 其中包括使用bcrypt 的功能,这是一种存储密码的好方法。

如果不在 postgres 中使用它,你可能会在你使用的语言之外考虑它。

相关链接:http://www.postgresql.org/docs/current/static/pgcrypto.html 用于 postgres-parts,http://codahale.com/how-to-safely-store-a-password/ 用于动机/解释您为什么要使用它。

【讨论】:

  • 啊,是的——很明显,凌晨一点对我的记忆没有帮助。在用于密码处理时,bcrypt 绝对比 sha256 更可取(scrypt 会更好……)
【解决方案2】:

无需在数据库中进行散列。如果你的盐基于用户名之类的东西,无需访问散列密码即可确定,它在应用程序级别同样安全:

password_hash = sha256(user_name + password)
user_id = query("SELECT id FROM user WHERE name=? and password_hash=?",
                user_name, password_hash).first()

或者您可以分两步检查用户名和密码,并使用用户 ID 作为盐:

user_id, password_hash = query("SELECT id, password_hash FROM user WHERE name=?",
                               user_name).first()
if password_hash != sha256(user_id + password):
    raise Exception("authentication failed")

【讨论】:

  • user_name 是易变的 - 在 usr_id 上加盐也可以吗?
  • 当然,这也可以:user_id, password_hash = query("SELECT id, password_hash FROM user WHERE name=?", user_name); if password_hash != sha256(user_id + password): raise Exception("authentication failed")
猜你喜欢
  • 2011-05-20
  • 2022-01-25
  • 1970-01-01
  • 2012-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-13
  • 2010-09-18
相关资源
最近更新 更多