PostgreSQL用户密码如何通过md5加密存储,是否加了salt
发表于:2025-11-16 作者:千家信息网编辑
千家信息网最后更新 2025年11月16日,一、PG用户的密码如何通过md5加密,并且是否加了salt?本文将从源码角度跟踪分析。PG用户通过md5加密时,加了salt,而这个salt是用户名字符串。二、源码分析CreateRole: s
千家信息网最后更新 2025年11月16日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安全错误
数据库的锁怎样保障安全
北京天元网络技术公司
ensp网络安全项目
2k21你与服务器的连接
南通长牌手机版软件开发
中核控制软件开发岗位
服务器磁盘满了会影响程序使用么
智阳网络技术有限公司运营部
服务器怎么设置流量大
闵行区信息化软件开发有哪些
设置ddos防护服务器
远程需要网络安全
c 与opc服务器
多种数据库比较
c 如何调用数据库
地税局网络安全专题汇报
lol职业联赛服务器比较
批量txt转数据库
软件开发规范国标现行
数据库 metadata
网络安全专家二维码
实体 实体类型 数据库
空间信息数据库数据模型
静态ip首选dns服务器
数据库新技术自学札记
本地服务器连接显示屏后怎么用
中国网络安全能力100强名单
软件开发一般分为五个阶段
服务器设置独立显卡
包头海天网络技术
ssh框架连接数据库连接