關於鹽值加密

2022-03-13 00:55:23 字數 3643 閱讀 7268

第一次聽說鹽值加密的時候,總是感覺怪怪的。因為總會聯想到鹹,聯想到密碼是鹹的。

其實這裡所說的鹽,簡單的說,就是一組安全隨機數。它會在特定的時候,加入到密碼中(一般來說是加密後的密碼)。從而使密碼變得更有味道(從單一簡單化到複雜化),更安全。

下面我們就通過安全威脅分析分別說說當前兩種加鹽的形式:

一、資料庫洩露

解決這個問題的通用方法是:

1、對密碼進行加密儲存

這樣的好處是,即使資料庫發生了洩露,攻擊者也不會拿到明文密碼,依然無法直接使用這些密碼。

2、對密碼進行加密

如前文所說,這個鹽是乙個隨機數。當使用者註冊乙個簡單密碼時,系統會同時生成這樣乙個salt,於該使用者對應,儲存到資料庫中。

這樣當使用者的密碼是888888時,後台真實儲存的密碼時888888鹽化以後的值。

操作步驟如下:

(1)註冊、修改密碼時,前台將 888888加密後的pwd1,傳入後台

(2)後台拿到pwd1以後,生成乙個相應的隨機數 salt。將pwd1與salt拼接並再次加密,生成pwd2

(3)後台將pwd2和salt 一併儲存到資料庫中。

(1-)當使用者每次輸入使用者名稱密碼後,將密碼加密生成pwd1'後,傳入後台。

(2-)後台拿到pwd1'後,根據使用者名稱id拿到對應的鹽值。與鹽值拼接加密後,生成pwd2『。

(3-)然後判斷pwd2'與資料庫中的pwd2是否一致即可。

這裡有兩點需要注意:

1、密碼在前後臺的加密方式可以採用不同的形式

2、鹽值的拼接不一定非要拼接到最後,也可以放在前邊、插在中間、甚至拆開或者倒序拼接。

3、(防盜連線:本文首發自 )

這樣即使是簡單密碼也沒關係。因為相同的密碼在資料庫中儲存的值並不一樣。攻擊者無法構造有效的彩虹表進行破解。

(二)重放攻擊

先拋開前邊的固化鹽值加密不說,我們再說說另外一種攻擊方式:重放攻擊(replay attacks)又叫重播攻擊、回放攻擊或新鮮性攻擊(freshness attacks)。

這裡舉個簡單的例子:當使用者a進行登入後,前台會將加密後的密碼,以資料報的形式傳送到服務端。服務端會進行鹽化等加密手段後,再進行安全校驗。可是如果這個資料報被攻擊者截獲。並且分析出資料報的結構(如哪些字段代表使用者名稱、哪些代表ip/會話id),然後進行適當的修改,再次傳送給服務端後,服務端依然會進行常規的校驗,依然會驗證通過。也就是說無論客戶端,服務端的加密手段多麼的複雜,一旦攻擊者有能力截獲和修改前後臺通訊的資料報,那麼這些攻擊都將不起作用。

那麼如何防範呢?仔細想想重放攻擊,攻擊者利用的是每次傳送的包(防盜連線:本文首發自 )中使用者名稱密碼等部分不變的機理。

那麼我們可以讓他改變,怎麼改變呢?

大致思路如下:

(1-)每次登陸時,我們可以生成乙個隨機數(乙個動態生成的salt),這個salt在前後臺各自儲存乙份。

(2-)當使用者名稱輸入完密碼pwd後。前台會進行 f1(pwd)加密,然後與動態生成的salt拼接,然後再次加密。

也就是 pwd1=f2(f1(pwd)+salt)。之後前台就把這個pwd1傳送到後台。(注意由於動態salt每次都會改變,所以pwd1每次也會改變)

(3-)後台拿到資料後,如果沒有使用固化鹽值加密的話,直接將資料庫中的資料採用相同的方式與服務端儲存的動態salt拼接加密然後再對比即可。

如果同時存在固化鹽值加密的話,需要想辦法剔除掉這個動態salt(即f2()使用可逆的機密演算法),然後再拼接固化salt接著再次加密,最後與資料庫對比即可。

第一次聽說鹽值加密的時候,總是感覺怪怪的。因為總會聯想到鹹,聯想到密碼是鹹的。

其實這裡所說的鹽,簡單的說,就是一組安全隨機數。它會在特定的時候,加入到密碼中(一般來說是加密後的密碼)。從而使密碼變得更有味道(從單一簡單化到複雜化),更安全。

下面我們就通過安全威脅分析分別說說當前兩種加鹽的形式:

一、資料庫洩露

解決這個問題的通用方法是:

1、對密碼進行加密儲存

這樣的好處是,即使資料庫發生了洩露,攻擊者也不會拿到明文密碼,依然無法直接使用這些密碼。

2、對密碼進行加密

如前文所說,這個鹽是乙個隨機數。當使用者註冊乙個簡單密碼時,系統會同時生成這樣乙個salt,於該使用者對應,儲存到資料庫中。

這樣當使用者的密碼是888888時,後台真實儲存的密碼時888888鹽化以後的值。

操作步驟如下:

(1)註冊、修改密碼時,前台將 888888加密後的pwd1,傳入後台

(2)後台拿到pwd1以後,生成乙個相應的隨機數 salt。將pwd1與salt拼接並再次加密,生成pwd2

(3)後台將pwd2和salt 一併儲存到資料庫中。

(1-)當使用者每次輸入使用者名稱密碼後,將密碼加密生成pwd1'後,傳入後台。

(2-)後台拿到pwd1'後,根據使用者名稱id拿到對應的鹽值。與鹽值拼接加密後,生成pwd2『。

(3-)然後判斷pwd2'與資料庫中的pwd2是否一致即可。

這裡有兩點需要注意:

1、密碼在前後臺的加密方式可以採用不同的形式

2、鹽值的拼接不一定非要拼接到最後,也可以放在前邊、插在中間、甚至拆開或者倒序拼接。

3、(防盜連線:本文首發自 )

這樣即使是簡單密碼也沒關係。因為相同的密碼在資料庫中儲存的值並不一樣。攻擊者無法構造有效的彩虹表進行破解。

(二)重放攻擊

先拋開前邊的固化鹽值加密不說,我們再說說另外一種攻擊方式:重放攻擊(replay attacks)又叫重播攻擊、回放攻擊或新鮮性攻擊(freshness attacks)。

這裡舉個簡單的例子:當使用者a進行登入後,前台會將加密後的密碼,以資料報的形式傳送到服務端。服務端會進行鹽化等加密手段後,再進行安全校驗。可是如果這個資料報被攻擊者截獲。並且分析出資料報的結構(如哪些字段代表使用者名稱、哪些代表ip/會話id),然後進行適當的修改,再次傳送給服務端後,服務端依然會進行常規的校驗,依然會驗證通過。也就是說無論客戶端,服務端的加密手段多麼的複雜,一旦攻擊者有能力截獲和修改前後臺通訊的資料報,那麼這些攻擊都將不起作用。

那麼如何防範呢?仔細想想重放攻擊,攻擊者利用的是每次傳送的包(防盜連線:本文首發自 )中使用者名稱密碼等部分不變的機理。

那麼我們可以讓他改變,怎麼改變呢?

大致思路如下:

(1-)每次登陸時,我們可以生成乙個隨機數(乙個動態生成的salt),這個salt在前後臺各自儲存乙份。

(2-)當使用者名稱輸入完密碼pwd後。前台會進行 f1(pwd)加密,然後與動態生成的salt拼接,然後再次加密。

也就是 pwd1=f2(f1(pwd)+salt)。之後前台就把這個pwd1傳送到後台。(注意由於動態salt每次都會改變,所以pwd1每次也會改變)

(3-)後台拿到資料後,如果沒有使用固化鹽值加密的話,直接將資料庫中的資料採用相同的方式與服務端儲存的動態salt拼接加密然後再對比即可。

如果同時存在固化鹽值加密的話,需要想辦法剔除掉這個動態salt(即f2()使用可逆的機密演算法),然後再拼接固化salt接著再次加密,最後與資料庫對比即可。

鹽值加密介紹

簡單說就是為了使相同的密碼擁有不同的hash值的一種手段 就是鹽化 md5自身是不可逆的 但是目前網路上有很多資料庫支援反查詢 如果使用者密碼資料庫不小心被洩露 黑客就可以通過反查詢方式獲得使用者密碼 或者對於資料庫中出現頻率較高的hash碼 即很多人使用的 進行暴力破解 因為它通常都是弱口令 鹽值...

鹽值加密介紹

簡單說就是為了使相同的密碼擁有不同的hash值的一種手段 就是鹽化 md5自身是不可逆的 但是目前網路上有很多資料庫支援反查詢 如果使用者密碼資料庫不小心被洩露 黑客就可以通過反查詢方式獲得使用者密碼 或者對於資料庫中出現頻率較高的hash碼 即很多人使用的 進行暴力破解 因為它通常都是弱口令 鹽值...

CAS 密碼鹽值加密

說明 md5加密時query 0 md5鹽值加密時encode 0 md5加密時fieldpassword,md5鹽值加密時passwordfieldname 1 md5加密 配置加密策略,直接在配置的資料來源下新增一下配置 資料庫配置 cas.authn.jdbc.query 0 url jdbc...