我正在學習使用pgcrypto 的crypt()函式來加密我的密碼并將它們存盤到用戶表中。
但是,我不明白如果我們將現有密碼作為第二個引數傳遞,crypt 函式如何生成相同的密碼。
我想了解它是如何做到的。
do $$
declare
generated_salt text;
hashResult text;
authenticationPassword text;
begin
-- select the number of actors from the actor table
select public.gen_salt('bf')
into generated_salt;
select public.crypt('password', generated_salt)
into hashResult;
select public.crypt('password', hashResult)
into authenticationPassword;
-- show the number of actors
raise notice 'Generated salt : %', generated_salt;
raise notice 'Hash result : %', hashResult;
raise notice 'authenticationPassword : %', authenticationPassword;
end; $$
在上面的示例中,如果我執行和存盤變數的值。
我得到: “$ 2A $ 06 $ .lub5s4Eqz4.epcg5zW4Ke”為generated_salt “$ 2A $ 06 $ .lub5s4Eqz4.epcg5zW4KervErzw // uARn8F2gchj2wM11ok.MJLK”為hashResult “$ 2A $ 06 $ .lub5s4Eqz4.epcg5zW4KervErzw // uARn8F2gchj2wM11ok.MJLK”為authenticationPassword
為什么authenticationPassword與hashResult相同,我期待它用 hashResult 作為鹽再次散列它。
它如何判斷它是否必須識別和計算相同的密碼或基于鹽生成新的哈希?
PS:我了解如何使用該功能來存盤/檢索密碼,但我不明白它是如何做到的。
感謝您的幫助,
uj5u.com熱心網友回復:
只要您使用相同的鹽,結果哈希對于每個密碼將始終是相同的。這是驗證密碼時發生的情況。
訣竅是,當一個新密碼被散列時(而不是在驗證它時),引擎會為其選擇一個全新的隨機鹽,因此幾乎不可能從散列結果中猜測它。
uj5u.com熱心網友回復:
我終于明白發生了什么,crypt 函式只使用前 29 個字符(作為鹽傳遞)來生成 hashOutput,所以即使你在這 29 個字符后面放了任何東西,結果也是一樣的。例子 :
public.crypt('password', '$2a$06$.lub5s4Eqz4.epcg5zW4Ke')
public.crypt('password', '$2a$06$.lub5s4Eqz4.epcg5zW4KervErzw//uARn8F2gchj2wM11ok.MJLK')
public.crypt('password', '$2a$06$.lub5s4Eqz4.epcg5zW4Keyadayadayadayada')
上面 3 行的結果總是 $2a$06$.lub5s4Eqz4.epcg5zW4KervErzw//uARn8F2gchj2wM11ok.MJLK 真正重要的是前 29 個字符$2a$06$.lub5s4Eqz4.epcg5z決定密碼的值是什么之后29 個字符:rvErzw//uARn8F2gchj2wM11ok.MJLK
pgcrypto 的源代碼幫助我了解幕后發生的事情:https : //github.com/postgres/postgres/tree/master/contrib/pgcrypto
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/326934.html
標籤:sql PostgreSQL 散列 密码学 pgcrypto
上一篇:使用條件時的語法錯誤
