MD5 哈希密码:在哪里进行哈希处理?
MD5 Hashed passwords: where does it get hashed?
我正在使用 md5 散列密码连接到本地 PostgreSQL 数据库。
它有效,但我想了解幕后发生的事情。
pq 在通过网络发送密码之前是否对密码进行哈希处理?它怎么知道是对其进行哈希处理还是将其保留为纯文本?服务器(在 pg_hba.conf 中)是指定如何通过连接发送密码的身份验证方法的服务器。
在发送带有密码的连接字符串之前,pq 和 psql 之间是否进行了握手?
user := "foo_user"
password := "test"
dbname := "bar"
connectionString := fmt.Sprintf(
"user=%s password=%s dbname=%s",
user,
password,
dbname)
db, err := sql.Open("postgres", connectionString)
用户是通过以下方式使用密码创建的:
ALTER USER foo_user WITH PASSWORD 'test';
并验证密码是否存储为散列:
postgres=# SELECT rolname, rolpassword from pg_authid;
rolname | rolpassword
-------------------+-------------------------------------
postgres |
pg_signal_backend |
foo_user | md51083525553eab8f4090ada980d2b86e7
(3 rows)
而pg_hba.conf完全没有修改:
# maintenance (custom daily cronjobs, replication, and similar tasks).
#
# Database administrative login by Unix domain socket
local all postgres peer
# TYPE DATABASE USER ADDRESS METHOD
# "local" is for Unix domain socket connections only
local all all peer
# IPv4 local connections:
host all all 127.0.0.1/32 md5
# IPv6 local connections:
host all all ::1/128 md5
密码散列有两个地方,不要混淆。
为角色设置密码时,它会与用户名连接,然后进行哈希处理。这是存储在pg_authid
中的密码,也就是PostgreSQL使用的实际密码。 PostgreSQL 不使用您输入的密码,而是使用它的哈希版本,以防止攻击者窃取您的密码,然后在 PostgreSQL 之外尝试使用它(以防在多个地方使用相同的密码)。
所以要侵入数据库,您实际上不需要知道明文密码,“实际”散列密码就足够了。
散列可以在两个地方进行:
在服务器端,如果你使用
CREATE/ALTER ROLE ... PASSWORD 'mypassword';
这不太好,因为密码是以明文形式通过网络发送的,它可以显示在数据库日志中。
在客户端,如果你使用
CREATE/ALTER ROLE ... PASSWORD 'hashedpassword';
这个更好,如果你使用 \password
命令,它就是 psql
内部使用的。
会话认证时,如果数据库指定的认证方式和用户需要。然后服务器将使用 AuthenticationMD5Password
消息响应连接请求(参见 the documentation)。
客户端然后对明文密码进行哈希处理以获得实际密码,然后再次对其进行哈希处理并提供随机“盐”由服务器。
服务器以相同的方式对来自 pg_authid
的密码进行哈希处理并比较结果。
我正在使用 md5 散列密码连接到本地 PostgreSQL 数据库。
它有效,但我想了解幕后发生的事情。
pq 在通过网络发送密码之前是否对密码进行哈希处理?它怎么知道是对其进行哈希处理还是将其保留为纯文本?服务器(在 pg_hba.conf 中)是指定如何通过连接发送密码的身份验证方法的服务器。
在发送带有密码的连接字符串之前,pq 和 psql 之间是否进行了握手?
user := "foo_user"
password := "test"
dbname := "bar"
connectionString := fmt.Sprintf(
"user=%s password=%s dbname=%s",
user,
password,
dbname)
db, err := sql.Open("postgres", connectionString)
用户是通过以下方式使用密码创建的:
ALTER USER foo_user WITH PASSWORD 'test';
并验证密码是否存储为散列:
postgres=# SELECT rolname, rolpassword from pg_authid;
rolname | rolpassword
-------------------+-------------------------------------
postgres |
pg_signal_backend |
foo_user | md51083525553eab8f4090ada980d2b86e7
(3 rows)
而pg_hba.conf完全没有修改:
# maintenance (custom daily cronjobs, replication, and similar tasks).
#
# Database administrative login by Unix domain socket
local all postgres peer
# TYPE DATABASE USER ADDRESS METHOD
# "local" is for Unix domain socket connections only
local all all peer
# IPv4 local connections:
host all all 127.0.0.1/32 md5
# IPv6 local connections:
host all all ::1/128 md5
密码散列有两个地方,不要混淆。
为角色设置密码时,它会与用户名连接,然后进行哈希处理。这是存储在
pg_authid
中的密码,也就是PostgreSQL使用的实际密码。 PostgreSQL 不使用您输入的密码,而是使用它的哈希版本,以防止攻击者窃取您的密码,然后在 PostgreSQL 之外尝试使用它(以防在多个地方使用相同的密码)。所以要侵入数据库,您实际上不需要知道明文密码,“实际”散列密码就足够了。
散列可以在两个地方进行:
在服务器端,如果你使用
CREATE/ALTER ROLE ... PASSWORD 'mypassword';
这不太好,因为密码是以明文形式通过网络发送的,它可以显示在数据库日志中。
在客户端,如果你使用
CREATE/ALTER ROLE ... PASSWORD 'hashedpassword';
这个更好,如果你使用
\password
命令,它就是psql
内部使用的。
会话认证时,如果数据库指定的认证方式和用户需要。然后服务器将使用
AuthenticationMD5Password
消息响应连接请求(参见 the documentation)。客户端然后对明文密码进行哈希处理以获得实际密码,然后再次对其进行哈希处理并提供随机“盐”由服务器。
服务器以相同的方式对来自
pg_authid
的密码进行哈希处理并比较结果。