
假设您想在客户端/服务器协议中实现密码身份验证方法。 您将如何做到这一点以及可能出现的问题是什么? 以下是 PostgreSQL 中如何完成此操作的故事。
password
一开始,PostgreSQL 只有 pg_hba.conf 中现在称为“password”的方法。 这是你能想象到的最简单的事情:
1.客户端对服务器说:“你好,我是 Peter,我想要连接。”
2.服务器回复:“你的密码是什么?”
3.客户端提示输入密码或从其他地方获取密码并响应:“这是‘123456’。”
4.现在服务器查找实际密码。 它存储在系统目录 pg_authid 列 rolpassword 中。 服务器基本上执行 strcmp(pg_authid.rolpassword, “123456”),如果相等,它会向客户端说“OK”,会话启动将继续。
这种方法有一些明显的问题:
•密码通过网络线路以明文形式传输。 有一些外部方法可以解决这个问题,例如使用 SSL 或其他加密封装。
•密码以明文形式存储在系统目录中,最终存储在磁盘上。 这很糟糕,因为它允许数据库和系统管理员看到其他用户的密码。 当然,人们不应该重复使用密码,但事实上人们可能会这样做。 它还可以允许管理员通过使用密码以其他用户身份登录来绕过审核。 一般来说,存在明文密码是不好的,因为它最终可能会被复制或意外看到。 最好不要这样做。
•更微妙的是,密码以明文形式存在于服务器进程的内存中。 为什么这么糟糕? 因为管理员也可能可以在那里访问它。 此外,如果服务器核心转储或交换,明文密码可能最终会出现在磁盘上的某个位置。 因此,这实际上几乎与在磁盘存储中以明文形式保存密码一样糟糕。
crypt
于是又尝试了另一种方法。这是在pg_hba.conf中不再支持的“crypt”认证方式。

本文介绍了PostgreSQL中多种密码身份验证方法,包括password、crypt、md5、scram等,分析了各方法存在的问题,如明文传输、存储等。目前采用的SCRAM解决了诸多问题,还提到了LDAP等认证方法,指出PostgreSQL通过SCRAM采用公共标准,状态良好且可适应未来。
最低0.47元/天 解锁文章
2092

被折叠的 条评论
为什么被折叠?



