PostgreSQL用户密码如何通过md5加密存储,是否加了salt
发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,一、PG用户的密码如何通过md5加密,并且是否加了salt?本文将从源码角度跟踪分析。PG用户通过md5加密时,加了salt,而这个salt是用户名字符串。二、源码分析CreateRole: s
千家信息网最后更新 2026年11月03日PostgreSQL用户密码如何通过md5加密存储,是否加了salt
一、PG用户的密码如何通过md5加密,并且是否加了salt?本文将从源码角度跟踪分析。
PG用户通过md5加密时,加了salt,而这个salt是用户名字符串。
二、源码分析
CreateRole: shadow_pass = encrypt_password(Password_encryption, stmt->role,password); |-- pg_md5_encrypt(password, role, strlen(role),encrypted_password); | |-- memcpy(crypt_buf, passwd, passwd_len); | | memcpy(crypt_buf + passwd_len, role, strlen(role)); | | strcpy(buf, "md5"); |-- |-- pg_md5_hash(crypt_buf, passwd_len + salt_len, buf + 3); new_record[Anum_pg_authid_rolpassword - 1] =CStringGetTextDatum(shadow_pass);三、gdb跟踪
1、在函数encrypt_password上打断点,然后客户端执行:create user yzs with password '123456';创建带密码的用户,观察是否默认使用md5。
postgres=# create user yzs with password '123456';2、堆栈信息
Breakpoint 1, encrypt_password (target_type=PASSWORD_TYPE_MD5, role=0x99c3b3c "yzs", password=0x99c3b4c "123456") at crypt.c:111111 PasswordType guessed_type = get_password_type(password);(gdb) bt#0 encrypt_password (target_type=PASSWORD_TYPE_MD5, role=0x99c3b3c "yzs", password=0x99c3b4c "123456") at crypt.c:111#1 0x0827b7a2 in CreateRole (pstate=0x9a0d804, stmt=0x99c3bbc) at user.c:412#2 0x0840fc18 in standard_ProcessUtility (pstmt=0x99c3c14, queryString=0x99c31dc "create user yzs with password '123456';", context=PROCESS_UTILITY_TOPLEVEL, params=0x0, queryEnv=0x0, dest=0x99c3d74, completionTag=0xbf9119e6 "") at utility.c:722#3 0x0840f42a in ProcessUtility (pstmt=0x99c3c14, queryString=0x99c31dc "create user yzs with password '123456';", context=PROCESS_UTILITY_TOPLEVEL, params=0x0, queryEnv=0x0, dest=0x99c3d74, completionTag=0xbf9119e6 "") at utility.c:357#4 0x0840e6ea in PortalRunUtility (portal=0x9a20634, pstmt=0x99c3c14, isTopLevel=1 '\001', setHoldSnapshot=0 '\000', dest=0x99c3d74, completionTag=0xbf9119e6 "") at pquery.c:1178#5 0x0840e8b7 in PortalRunMulti (portal=0x9a20634, isTopLevel=1 '\001', setHoldSnapshot=0 '\000', dest=0x99c3d74, altdest=0x99c3d74, completionTag=0xbf9119e6 "") at pquery.c:1324#6 0x0840ded2 in PortalRun (portal=0x9a20634, count=2147483647, isTopLevel=1 '\001', run_once=1 '\001', dest=0x99c3d74, altdest=0x99c3d74, completionTag=0xbf9119e6 "") at pquery.c:799#7 0x08408692 in exec_simple_query (query_string=0x99c31dc "create user yzs with password '123456';") at postgres.c:1099#8 0x0840c5d4 in PostgresMain (argc=1, argv=0x997edc4, dbname=0x997ecf4 "postgres", username=0x99558cc "postgres") at postgres.c:4088#9 0x083864e6 in BackendRun (port=0x9978038) at postmaster.c:4409#10 0x08385c5d in BackendStartup (port=0x9978038) at postmaster.c:4081#11 0x083822d9 in ServerLoop () at postmaster.c:1755#12 0x083819d6 in PostmasterMain (argc=3, argv=0x9953810) at postmaster.c:1363#13 0x082dfb60 in main (argc=3, argv=0x9953810) at main.c:228(gdb) n114 if (guessed_type != PASSWORD_TYPE_PLAINTEXT)(gdb) 123 switch (target_type)(gdb) 126 encrypted_password = palloc(MD5_PASSWD_LEN + 1);(gdb) 128 if (!pg_md5_encrypt(password, role, strlen(role),(gdb) spg_md5_encrypt (passwd=0x99c3b4c "123456", salt=0x99c3b3c "yzs", salt_len=3, buf=0x9a0d984 "") at md5.c:326326 size_t passwd_len = strlen(passwd);(gdb) n329 char *crypt_buf = malloc(passwd_len + salt_len + 1);(gdb) 332 if (!crypt_buf)(gdb) 339 memcpy(crypt_buf, passwd, passwd_len);(gdb) 340 memcpy(crypt_buf + passwd_len, salt, salt_len);(gdb) p crypt_buf$1 = 0x9979e68 "123456A"(gdb) n342 strcpy(buf, "md5");(gdb) p crypt_buf$2 = 0x9979e68 "123456yzsנ\tQ"(gdb) n343 ret = pg_md5_hash(crypt_buf, passwd_len + salt_len, buf + 3);(gdb) p crypt_buf$3 = 0x9979e68 "123456yzsנ\tQ"(gdb) n345 free(crypt_buf);(gdb) p crypt_buf$4 = 0x9979e68 "123456yzsנ\tQ"(gdb) n347 return ret;(gdb) 348 }(gdb) p ret$5 = 1 '\001'(gdb) nencrypt_password (target_type=PASSWORD_TYPE_MD5, role=0x99c3b3c "yzs", password=0x99c3b4c "123456") at crypt.c:131131 return encrypted_password;(gdb) 146 }(gdb) CreateRole (pstate=0x9a0d804, stmt=0x99c3bbc) at user.c:415415 CStringGetTextDatum(shadow_pass);(gdb) p shadow_pass$6 = 0x9a0d984 "md5aed8080c314507e15542d5e9519723a8"3、从pg_authid表中观察该用户经过md5加过密的密码值,可以看出和堆栈信息中看到的一样
postgres=# select *from pg_authid where rolname='yzs'; rolname | rolsuper | rolinherit | rolcreaterole | rolcreatedb | rolcanlogin | rolreplication | rolbypa***ls | rolconnlimit | rolpassword | rolvaliduntil ---------+----------+------------+---------------+-------------+-------------+----------------+--------------+--------------+-------------------------------------+--------------- yzs | f | t | f | f | t | f | f | -1 | md5aed8080c314507e15542d5e9519723a8 | (1 row)
用户
密码
加密
信息
堆栈
源码
分析
观察
跟踪
函数
字符
字符串
客户
客户端
用户名
角度
存储
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
广东万易互联网科技有限公司惠州分公司
中关村互联网 科技集团
远拓互联网科技
互联网科技网站
科技互联网创业计划书
互联网金融科技委员会
互联网巨头投资的硬核科技
北京华百购互联网科技有限公司
厦门千工互联网科技有限公司
华夏互联网科技业
崇明区互联网教育科技售后服务
苏州铭阳互联网科技有限公司
本届互联网博览会上的黑科技
沐思想互联网科技有限公司
四川互联网展示科技馆设计
富国互联网科技002692
上海创道互联网络科技有限公司
江苏互联网智能科技产品出厂价
数字互联网科技有限公司
互联网领先科技成果宣传视频
今日互联网科技
世界互联网领先科技成果
美国互联网前沿科技
科技大学互联网专业好不好
湖南洣水互联网科技有限公司扣款
晋城互联网科技
用友工业互联网科技发展
中科明德北京互联网科技
互联网科技接地气
每日互联网科技新闻