摘要:結論對用戶密碼進行加密時需要做到防止用戶密碼明文被竊聽交給,明文傳輸。為什么鹽可以明文存儲攻擊者很難有足夠的計算資源和存儲空間建立海量的哈希值密碼數據庫,針對單條用戶記錄,建立哈希值密碼數據庫進行攻擊的成本過高。
摘要
密碼驗證是很常見的需求,如何在實現功能之余,防止用戶密碼泄露,已經有了很成熟的方案。這篇文章把自己的思考和結論做一下記錄。
結論對用戶密碼進行加密時需要做到:
防止用戶密碼明文被竊聽1.交給https,明文傳輸。
2.客戶端將密碼加鹽(鹽隨機生成、具有強度)并哈希。服務端再次加鹽哈希并對比。假設https被竊聽,攻擊者破解密碼明文也具有相當難度。
1.增加哈希算法強度。
2.隨機生成具有強度的鹽。
哈希算法是不可逆的。攻擊者可以生成海量的密碼 -> 哈希值鍵值對,反向映射,有概率通過哈希值得到密碼。
故,破解的成本=哈希算法強度×鹽值數量。
計算耗時用戶可接受(視應用場景,如0.2S內)。
計算耗時盡量長,即增加哈希算法強度。
為什么鹽要隨機如果鹽不隨機,攻擊者可以針對單個鹽生成哈希值->密碼鍵值對,再對整個數據庫的哈希值做匹配。
假設鹽是保密的,鹽可能因為各種原因被攻擊者獲取(代碼泄漏、社會工程學等等)。
攻擊者也可以通過在數據庫被攻破的網站上注冊用戶,通過 哈希值->攻擊者密碼+鹽 來破解鹽。
如果鹽的強度(長度)不夠。攻擊者可以建立多個 哈希值->密碼 數據庫,簡單鹽被匹配(攻破)的概率更高。
為什么鹽可以明文存儲攻擊者很難有足夠的計算資源和存儲空間建立海量的 哈希值->密碼 數據庫,針對單條用戶記錄,建立 哈希值->密碼 數據庫進行攻擊的成本過高。
php的實現 最初的想法需求是房間密碼,出于簡單考慮,我最初的想法是,MD5+隨機鹽。
在數據庫里大致是這樣:
+-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | uid | int(11) | NO | PRI | NULL | | | pwd | varchar(45) | YES | | NULL | | | salt | varchar(45) | YES | | NULL | | +-------+-------------+------+-----+---------+-------+php的推薦實現
php的md5文檔
http://php.net/manual/zh/func...
給了一個很好的指引:
http://php.net/manual/zh/faq....
password_hash 和 crypt 函數返回值的組成部分,依次為:所選擇的算法,算法選項,所使用的“鹽”,以及散列后的密碼。
更改后、數據庫表變為:
+-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | uid | int(11) | NO | PRI | NULL | | | pwd | varchar(255) | YES | | NULL | | +-------+-------------+------+-----+---------+-------+
相較之前的方案:
1.記錄了采用的算法(可以在不改動代碼的情況下升級算法)
2.記錄了采用算法的cost(強度),可以在硬件計算能力上升的情況下,調整cost來維持安全性。
3.鹽和哈希值一并返回,簡化了接口調用、數據庫存儲。
php的驗證接口設計得相當漂亮。
使用簡單,強制調用者使用隨機的salt(不容易誤用),可在不修改代碼的情況下拓展算法強度。
代碼:
if (!empty($xxxx_info["pwd"])) { // 若原來有密碼,則要檢測 if (!password_verify($old_pwd, $xxxx_info["pwd"])) { // 用戶名或密碼錯 return; } } // 對密碼長度、內容等不做限制。 // 以應用場景來說,123456之類也無所謂。 $pwd_in_db = password_hash($new_pwd, PASSWORD_DEFAULT, array("cost" => 6));參考
http://php.net/manual/zh/faq....
http://www.infoq.com/cn/artic...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/26233.html
摘要:所以我們今天只談前端加密,一個部分人認為沒有意義的工作。在中,認證過程使用了非對稱加密算法,非認證過程中使用了對稱加密算法。非對稱加密上文中我們討論了前端的哈希加密以及應用的場景。 showImg(https://segmentfault.com/img/bVAhTC); 當然在談安全。 前端安全是Web安全的一部分,常見的安全問題會有XSS、CSRF、SQL注入等,然而這些已經在程師...
摘要:描述客戶使用報表并將其集成到自己的產品中,然后提供給最終用戶使用,最終用戶可以預覽模板,但是不能打開模板進行設計修改。點擊確定即可,然后就會對該工程下的所有模板進行加密。注加密只能對工程下所有模板加密,不能單獨加密。 1.描述FR客戶使用FineReport報表并將其集成到自己的產品中,然后提供給最終用戶使用,最終用戶可以預覽FR模板,但是不能打開模板進行設計修改。FineReport...
摘要:非對稱加密算法的安全性往往需要基于數學問題來保障,目前主要有基于大數質因子分解離散對數橢圓曲線等經典數學難題進行保護。消息認證碼基于對稱加密,可以用于對消息完整性進行保護。 Hash 算法與數字摘要 Hash (哈希或散列)算法它能將任意長度的二進制明文串映射為較短的(通常是固定長度的)二進制串(Hash值),并且不同的明文很難映射為相同的Hash值。 Hash 定義 Hash (哈希...
閱讀 2183·2021-11-19 09:40
閱讀 1919·2021-11-08 13:24
閱讀 2453·2021-10-18 13:24
閱讀 2858·2021-10-11 10:57
閱讀 3578·2021-09-22 15:42
閱讀 1114·2019-08-29 17:11
閱讀 2528·2019-08-29 16:11
閱讀 2421·2019-08-29 11:11