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: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加過密的密碼值,可以看出和堆疊資訊中看到的一樣
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)
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31493717/viewspace-2637913/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 如何加密傳輸和儲存使用者密碼加密密碼
- 將 Laravel 使用者密碼加密方式修改為 md5+salt 方式Laravel密碼加密
- springboot使用者登陸密碼兩次md5加密Spring Boot密碼加密
- 儲存使用者密碼應該使用什麼加密演算法?密碼加密演算法
- 在密碼學中,“加鹽”(Salting)是指在儲存使用者密碼的雜湊值之前,向原始密碼新增一個隨機生成的字串(稱為“鹽”Salt)的過程。密碼學隨機字串
- IoTDB透過MQTT儲存 windowsMQQTWindows
- LightDB/PostgreSQL 相容Oracle儲存過程SQLOracle儲存過程
- win10 mstsc怎麼儲存遠端密碼_win10 mstsc如何儲存遠端密碼Win10密碼
- 如何查詢一個儲存過程是否在執行儲存過程
- 資料庫到底應該如何儲存密碼?資料庫密碼
- python_hashlib,md5,getpass, 密碼加密,隱藏,加鹽Python密碼加密
- win10檢視儲存的wifi密碼_如何檢視win10電腦儲存的wifi密碼Win10WiFi密碼
- 如何透過Hibernate/JPA在MySQL中儲存UTC時區?MySql
- 5、域滲透——利用SYSVOL還原組策略中儲存的密碼密碼
- Java實現密碼、檔案MD5加密,密碼sha256、sha384、sha512Hex等加密Java密碼加密
- 2.9.3 安全的外部密碼儲存密碼
- shiro入門學習--使用MD5和salt進行加密|練氣後期加密
- 透過使用者名稱密碼認證保障 MQTT 接入安全密碼MQQT
- 加密技術的未來:從服務端密碼儲存到使用者資料加密方案加密服務端密碼
- PostgreSQL獲取建表語句儲存過程SQL儲存過程
- 談談系統密碼儲存策略密碼
- git儲存賬號密碼到本地Git密碼
- 檢測域賬號是否禁用、密碼是否永不過期密碼
- Chrome如何檢視儲存的網站密碼,如此簡單!Chrome網站密碼
- 如何基於Security框架相容多套使用者密碼加密方式框架密碼加密
- mysql如何呼叫儲存過程MySql儲存過程
- 儲存過程_造使用者資料儲存過程
- SQLServer查詢使用者儲存過程SQLServer儲存過程
- 如何透過 open-local 玩轉容器本地儲存? | 龍蜥技術
- 安卓實現賬號密碼儲存安卓密碼
- oracle如何修改單個使用者密碼永不過期Oracle密碼
- .NET 證書加密 儲存儲存 IIS授權加密
- 美股券商Robinhood承認以明文方式儲存了部分使用者密碼密碼
- TortoiseGit(烏龜git) 清除已經儲存使用者名稱密碼的方法Git密碼
- 最新webqq密碼的加密方式分析過程Web密碼加密
- 摩杜雲:物件儲存可以透過哪些方式使用?物件
- MD5加密加密
- vertica 如何實現儲存過程?儲存過程