TLDR。如果您正确配置它并使用良好的长密码,它可能是安全的。
1.在 postgres 中,md5 auth-method
表示客户端散列(讨论:1、2 ),这使得散列密码等效。将数据库中的哈希与从客户端接收到的哈希进行比较。攻击者可以直接使用窃取的 pg_shadow 表中的任何散列,甚至无需花费时间破解 md5。
假设哈希最终会被盗并避免客户端哈希更安全。
您实际上可以只看一下代码,它非常简单:https://github.com/postgres/postgres/blob/master/src/backend/libpq/crypt.c#L141 <- 直接链接到这一行:
if (strcmp(crypt_client_pass, crypt_pwd) == 0)
看看当port->hba->auth_method == uaMD5
. 是的,不能截获散列明文,它再次被加盐和散列。但是当被任何其他攻击窃取时,它可以直接使用而无需破解。
2.不出所料,您可以通过使用password auth-method
and将服务器端 md5 散列与 postgres 一起使用create user whatever with encrypted password
。
除了通过连接发送密码的方式(即分别为 MD5 散列和明文)之外,这些方法的操作类似。
使用 SSL 保护明文密码。您可能应该知道它的哈希存储方式——盐被重用:
/* Encrypt user-supplied password to match stored MD5 */
if (!pg_md5_encrypt(client_pass, // const char *passwd
port->user_name, // const char *salt
strlen(port->user_name),
crypt_client_pass)) // char *buf
甚至可以创建随机生成的一次性用户名以将它们用作盐,但我不确定这是否是个好主意,这很容易出错。
虽然一般建议是从 md5 迁移,但它仍然没有被密码散列破坏。相关问题:1996 年以来,如果 MD5 被破解,为什么人们仍然使用/推荐它?
不要使用短密码。长而高质量的随机密码仍然是安全的。
为了快速估计,这些(不幸的是,相当旧的)链接有一些数字: http:
//blog.codinghorror.com/speed-hashing/
https://security.stackexchange.com/a/33684/41687
更新:感谢 irc.freenode.net 上#postgresql 频道的 RhodiumToad 澄清 md5 仍未因密码散列而损坏,良好的长密码将节省时间。