当前位置: 首页 > 知识库问答 >
问题:

如何生成SCRAM-SHA-256以创建Postgres 13用户

马边浩
2023-03-14

我想使用CREATE USER命令和已经散列的密码摘要创建一个Postgres用户。经过大量搜索,我认为只有MD5才有可能,直到我找到这个链接。我已经验证了它是这样工作的:

CREATE USER test_user WITH LOGIN PASSWORD 'SCRAM-SHA-256$4096:H45+UIZiJUcEXrB9SHlv5Q==$I0mc87UotsrnezRKv9Ijqn/zjWMGPVdy1zHPARAGfVs=:nSjwT9LGDmAsMo+GqbmC2X/9LMgowTQBjUQsl45gZzA=';

然后,我可以使用密码登录该用户,本文不一定说,但它是“postgres”。现在我知道这是可能的,如何使用.NET 5生成Postgres 13将接受的scram-sha-256摘要?我见过其他Postgres文章使用过时的MD5哈希,其中用户名在哈希之前与密码连接。新的scram-sha-256也需要这样做吗?我在任何地方都找不到有关此主题的太多信息。

共有3个答案

丌官绍元
2023-03-14

如果您的目的是在拥有操作数据库之前生成SCRAM-SHA-256密码,那么我发现您可以使用此方法使用Docker工具生成密码哈希。

docker run --rm -it --name postgres-dummy -d -e POSTGRES_HOST_AUTH_METHOD=trust postgres:14-alpine
docker exec -it postgres-dummy psql -U postgres
 \password
 (type in your password twice)
 select rolpassword from pg_authid where rolname = 'postgres';
 \q
docker stop postgres-dummy

我知道这不是个好办法。NET,但希望它对某些人有用。

史涵育
2023-03-14

有人构建了一个围棋工具来实现这一点:

https://github.com/supercaracal/scram-sha-256

这是一个基于Go项目的python 3端口:

from base64 import standard_b64encode
from hashlib import pbkdf2_hmac, sha256
from os import urandom
import hmac
import sys


salt_size = 16
digest_len = 32
iterations = 4096


def b64enc(b: bytes) -> str:
    return standard_b64encode(b).decode('utf8')


def pg_scram_sha256(passwd: str) -> str:
    salt = urandom(salt_size)
    digest_key = pbkdf2_hmac('sha256', passwd.encode('utf8'), salt, iterations,
                             digest_len)
    client_key = hmac.digest(digest_key, 'Client Key'.encode('utf8'), 'sha256')
    stored_key = sha256(client_key).digest()
    server_key = hmac.digest(digest_key, 'Server Key'.encode('utf8'), 'sha256')
    return (
        f'SCRAM-SHA-256${iterations}:{b64enc(salt)}'
        f'${b64enc(stored_key)}:{b64enc(server_key)}'
    )


def print_usage():
    print("Usage: provide single password argument to encrypt")
    sys.exit(1)


def main():
    args = sys.argv[1:]

    if args and len(args) > 1:
        print_usage()

    if args:
        passwd = args[0]
    else:
        passwd = sys.stdin.read().strip()

    if not passwd:
        print_usage()

    print(pg_scram_sha256(passwd))


if __name__ == "__main__":
    main()

辛龙野
2023-03-14

我不知道如何生成一个scram-sha-256摘要。净5。但是,如果scram-sha-256 digest是您所需要的,您可以使用一种变通方法,在本地创建一个伪postgres用户,并用< code>createuser命令回显加密的密码。

例如(通常以Linux postgres用户身份运行:<code>su postgres</code>):

$ createuser dummyuser -e --pwprompt
Enter password for new role: 
Enter it again: 
SELECT pg_catalog.set_config('search_path', '', false);
CREATE ROLE dummyuser PASSWORD 'SCRAM-SHA-256$4096:VnimR0aOywxZzY82nzy9Fg==$qF9uMCU6YsKoecvRjP8jSmZZxrXgn5VwzhHwfoWo5Xg=:xGYfBUvGsu9mZFiq1nSFaHi7uN8n47IDwHO32IeK9io=' NOSUPERUSER NOCREATEDB NOCREATEROLE INHERIT LOGIN;

现在可以将摘要复制到查询中。当然,只有当您不需要使用.NET动态生成摘要时,这才有效。

不要忘记删除虚拟用户:

$ dropuser dummyuser

此外,如果您的本地postgres db仍然使用/生成md5,您必须使用以下查询将其更改为scram,以postgres超级用户身份运行:

ALTER SYSTEM SET password_encryption = 'scram-sha-256';
SELECT pg_reload_conf();

但是,如果您想使用. NET动态创建摘要,我建议您查看createuser命令的源代码...

一天后更新:

以下是将密码加密为scram-sha-256字符串的createuser命令的具体源代码

  • https://github.com/postgres/postgres/blob/6beb38cfc9ddd4cd3d2eb5402981ebdd69a618b4/src/interfaces/libpq/fe-auth-scram.c#L884-L921

为了让生活更轻松,以下是上述函数正在调用的函数(可能不是全部)的链接

    < Li > https://github . com/postgres/postgres/blob/6be b38 CFC 9 DD D4 CD 3d 2 EB 5402981 ebdd 69 a 618 b 4/src/common/saslprep . c # l 1023-l 1245 < Li > https://github . com/postgres/postgres/blob/6be b38 CFC 9 DD D4 CD 3d 2 EB 5402981 ebdd 69 a 618 b 4/src/common/scram-common . c # L160-L274

您应该能够用。NET或任何其他语言。希望有帮助!

 类似资料:
  • 我能够让SCRAM-SHA-256身份验证与pgpool一起使用,但是我还没有找到一个很好的例子来设置pgbouner。我正在尝试使用auth_query。在postgres中,pgbounker将连接的用户将密码加密并存储在SCRAM-SHA-256中。但是我不知道如何在userlist.txt.中创建条目这应该是格式: 存储密钥和服务器密钥到底是什么,我如何生成它们?我可以使用哪些工具来创建它

  • 我很难把Gradle分发插件和校验和插件放在一起。 问题: 如何获取分发插件生成的所有文件的列表?fileList()方法不起作用

  • 当我尝试安装 patroni 时,我可以使用 md5 初始化数据库,所有的集群都运行良好。. 但当我试图用初始化紧急停堆sha 256安装patroni时,它没有启动,状态也保持不变 群集中所有数据库实例的“副本”。同样在patroni日志上,我可以看到这个错误“”postgres“没有有效的SCRAM验证器”。解决方案是什么? 信息:password_encryption是scram-sha 2

  • 问题内容: 我知道字符串“ foobar” 使用http://hash.online-convert.com/sha256-generator生成SHA-256哈希 但是命令行shell: 生成不同的哈希。我想念什么? 问题答案: 通常会输出换行符,用禁止。尝试这个:

  • 在PostgreSQL 10中,scram-sha-256设置使用了多少次迭代? 医生只是说 将此参数设置为scram-sha-256将使用scram-sha-256加密密码。 生成日志读取。 添加SCRAM-SHA-256对密码协商和存储的支持(Michael Paquier, Heikki Linnakangas)这证明了比现有的md5协商和存储方法更好的安全性。

  • 我编辑: 并添加了以下行: 并将该文件中的所有更改为。 作为用户,我创建了一个具有超级用户权限的新用户: 然后我重启了Postgres: 并尝试使用pgAdmin4登录,我在数据库的连接属性下更改了用户名。但无论是那个还是< code>psql -U username testdb 致命:用户“用户名”的密码身份验证失败 那么,我怎样才能让 Postgres 在我的 Debian9/KDE 机器上