PostgreSQL用户密码如何通过md5加密存储,是否加了salt

一、PG用户的密码如何通过md5加密,并且是否加了salt?本文将从源码角度跟踪分析。

PG用户通过md5加密时,加了salt,而这个salt是用户名字符串。

二、源码分析

1

2

3

4

5

6

7

8

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。

1

postgres=# create user yzs with password '123456';

2、堆栈信息

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

Breakpoint 1, encrypt_password (target_type=PASSWORD_TYPE_MD5, role=0x99c3b3c "yzs", password=0x99c3b4c "123456") at crypt.c:111

111     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) n

114     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) s

pg_md5_encrypt (passwd=0x99c3b4c "123456", salt=0x99c3b3c "yzs", salt_len=3, buf=0x9a0d984 "") at md5.c:326

326     size_t      passwd_len = strlen(passwd);

(gdb) n

329     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) n

342     strcpy(buf, "md5");

(gdb) p crypt_buf

$2 = 0x9979e68 "123456yzsנ\tQ"

(gdb) n

343     ret = pg_md5_hash(crypt_buf, passwd_len + salt_len, buf + 3);

(gdb) p crypt_buf

$3 = 0x9979e68 "123456yzsנ\tQ"

(gdb) n

345     free(crypt_buf);

(gdb) p crypt_buf

$4 = 0x9979e68 "123456yzsנ\tQ"

(gdb) n

347     return ret;

(gdb) 

348 }

(gdb) p ret

$5 = 1 '\001'

(gdb) n

encrypt_password (target_type=PASSWORD_TYPE_MD5, role=0x99c3b3c "yzs", password=0x99c3b4c "123456") at crypt.c:131

131             return encrypted_password;

(gdb) 

146 }

(gdb) 

CreateRole (pstate=0x9a0d804, stmt=0x99c3bbc) at user.c:415

415                 CStringGetTextDatum(shadow_pass);

(gdb) p shadow_pass

$6 = 0x9a0d984 "md5aed8080c314507e15542d5e9519723a8"

3、从pg_authid表中观察该用户经过md5加过密的密码值,可以看出和堆栈信息中看到的一样

1

2

3

4

5

postgres=# select *from pg_authid where rolname='yzs';

 rolname | rolsuper | rolinherit | rolcreaterole | rolcreatedb | rolcanlogin | rolreplication | rolbypassrls | rolconnlimit |             rolpassword             | rolvaliduntil 

---------+----------+------------+---------------+-------------+-------------+----------------+--------------+--------------+-------------------------------------+---------------

 yzs     | f        | t          | f             | f           | t           | f              | f            |           -1 | md5aed8080c314507e15542d5e9519723a8 | 

(1 row)

内容转载于:http://blog.itpub.net/31493717/viewspace-2637913/ 

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值