Security 在只有md5加密的postgres中,保存密码的最佳方式是什么?

Security 在只有md5加密的postgres中,保存密码的最佳方式是什么?,security,postgresql,encryption,passwords,Security,Postgresql,Encryption,Passwords,PostgreSQL只有MD5用于存储密码的加密 通过阅读黑客日志,似乎MD5本身并不是存储密码的非常安全的方式 我在客户端使用了MD5中的MD5-MD5一次,然后在数据库中再次使用了MD5,但我不知道这有多强大 首先,是否有必要加强密码的存储?第二,什么是简单、有效的跨语言方法?不需要在数据库中进行哈希运算。如果您的salt基于用户名之类的内容,而用户名可以在不访问散列密码的情况下确定,那么它在应用程序级别也同样安全: password_hash = sha256(user_name + pa

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

通过阅读黑客日志,似乎MD5本身并不是存储密码的非常安全的方式

我在客户端使用了MD5中的MD5-MD5一次,然后在数据库中再次使用了MD5,但我不知道这有多强大


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

不需要在数据库中进行哈希运算。如果您的salt基于用户名之类的内容,而用户名可以在不访问散列密码的情况下确定,那么它在应用程序级别也同样安全:

password_hash = sha256(user_name + password)
user_id = query("SELECT id FROM user WHERE name=? and password_hash=?",
                user_name, password_hash).first()
或者,您可以通过两个单独的步骤检查用户名和密码,并将用户ID用作salt:

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")

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

如果不在PigGrES中使用它,你可以把它放在你所使用的语言之外。


相关链接:用于postgres部分以及动机/解释您为什么要使用它。

投票人结束:您介意解释您的推理吗?广泛使用存储过程,因此传统上,在移植到应用程序级别之前,我们在db级别对所有内容进行测试。也许你是对的-也许我的方法让我看不到显而易见的东西。当然,你也可以使用
pgcrypto
:…但如果是我,我只会在应用程序级别上使用:)pgcrypto-也由@plundra链接-看起来很棒。就我个人而言,我觉得更好的是知道数据库将始终加密敏感信息,而不管应用程序有什么漏洞,但将所有应用程序代码放在一个地方也是非常有意义的。MD5不是一种加密方法;在这里使用术语时要小心,这可能会导致误解用户名是易变的-在usr\U id上加盐也会起作用吗?当然,这也会起作用:
user\u id,password\u hash=query(“从user WHERE name=?”中选择id,password\u hash,user\u name”);如果密码\u散列!=sha256(用户id+密码):引发异常(“身份验证失败”)
Ah,是的-很明显,早起对我的记忆力没有帮助。在使用bcrypt进行密码共享时,它肯定比sha256更可取(而且scrypt会更好…)