0

我正在使用 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
4

1 回答 1

1

有两个地方会发生密码散列,不应混淆它们。

  1. 为角色设置密码时,会将其与用户名连接起来,然后进行散列处理。这是存储在 中的密码pg_authid,也是PostgreSQL 使用的实际密码。PostgreSQL 不使用您输入的密码,而是使用它的哈希版本,以防止攻击者窃取您的密码,然后在 PostgreSQL 之外尝试它(以防在多个地方使用相同的密码)。

    所以要闯入数据库,你实际上并不需要知道明文密码,“实际”散列密码就足够了。

    有两个地方可以进行散列:

    • 在服务器端,如果您使用

      CREATE/ALTER ROLE ... PASSWORD 'mypassword';
      

      这不太好,因为密码是通过网络以明文形式发送的,并且可以显示在数据库日志中。

    • 在客户端,如果您使用

      CREATE/ALTER ROLE ... PASSWORD 'hashedpassword';
      

      psql这更好,如果您使用该\password命令,它就是内部使用的。

  2. 在会话认证期间,如果为数据库和用户指定的认证方法需要它。然后,服务器将使用AuthenticationMD5Password消息响应连接请求(请参阅文档)。

    客户端然后对明文密码进行哈希处理以获得实际密码,然后使用服务器提供的随机“盐”再次对其进行哈希处理。

    服务器以相同的方式对密码进行哈希处理pg_authid并比较结果。

于 2017-12-22T21:32:19.600 回答