1. 程式人生 > >複雜的 Hash 函式組合有意義嗎?

複雜的 Hash 函式組合有意義嗎?

很久以前看到一篇文章,講某個大網站儲存使用者口令時,會經過十分複雜的處理。怎麼個複雜不記得了,大概就是將口令先 Hash,結果加上一些特殊字元再 Hash,然後中間插入些字元再 Hash、再怎麼怎麼的。。。看的眼花繚亂。

當時心想這麼複雜應該很安全了吧。事實上即使現在,仍有不少人是這麼認為的。所以在儲存賬號口令時,經常會弄些千奇百怪的組合。

不過,千奇百怪的 Hash 演算法究竟有意義嗎?在什麼情況下能派上用場?是否有更簡單合理的替代方案?這問題先從拖庫說起。

知道演算法才能破解

資料庫中的口令,都是以 Hash 形式儲存的。拖下資料庫後,如果要猜某個賬號的明文口令,得通過跑字典的方式:

for each word in 常用詞彙
    if H(word) == E
        print "明文:",word
        exit

不過,光有洩露的資料 E 不夠,還得知道演算法 H 才能跑的起來。光有 Hash 值,卻不知道用的是那種 Hash 演算法,仍然無從下手。

當然很多小網站,資料庫和演算法在同個系統裡,一旦入侵兩者都洩露了;但若資料庫和演算法不在同個系統裡,即使能拖庫也未必知道演算法。

猜演算法

不過即使搞不到演算法,也可以嘗試猜測。比如先在網站上註冊個賬號 —— 例如口令為 123456,然後在洩露的庫中,根據使用者名稱找到對應口令的 Hash 值,例如 dd6e5e5918e94d997c686fcebc56922f。

這時,就可以暴力猜演算法了:

for each fn in 常用演算法
    if fn("123456") == dd6e5e5918e94d997c686fcebc56922f
        print "演算法:", fn
        exit

不難猜出,fn 為 f(x) = md5(sha256(x))。知道了演算法,就可愉快的跑字典了。

奇怪演算法

這時「奇怪演算法」的優勢就體現出來了。 如果使用的演算法十分奇葩,比如:

f(x) = md5("hello~" + sha1(sha256(x)) + "world!")

根本不在常用演算法裡,幾乎難以窮舉到,於是就能躲過「猜演算法」這種攻擊方式。

所以,奇怪的演算法是有意義的!

不過奇怪、奇葩、變態...這些都是人的主觀感覺,並不能用理性來衡量。比如說剛才那個演算法有多複雜?你只能說很複雜,而難以給出一個準確的程度。

演算法簡單,資料複雜

通過混合拼湊多個函式,來製造複雜程度,終究不是最合適的。

不妨把複雜轉移到資料上,例如上述的 "hello~" 和 "world!",如果換成更長、更沒意義、更難猜測的資料,不也能製造複雜嗎?

所以,最終可以把函式精簡到只剩一個,取而代之的是複雜的資料,例如:

f(x) = sha256(x + "18bc0a594ab5f65d868820b238b696e391eabb962e1d15c2c474a04735c1128f")

這串資料稱之為金鑰。金鑰是隨機生成的,沒有任何意義,並且絕不能對外透露。

這樣,複雜程度就能在金鑰空間上體現出來,而不是難以衡量的奇怪函式組合

不過這裡有個疑惑,為什麼「金鑰」加在原文後面,而不是前面、或者夾在中間?如果僅僅是看著舒服,那還是存在主觀因素的。

HMAC

事實上,密碼學家早已提供支援兩個引數的 Hash 用法 —— HMAC,它比簡單粗暴的拼接靠譜得多。於是上述可改進成:

f(x) = hmac_sha256(x, "18bc0a594ab5f65d868820b238b696e391eabb962e1d15c2c474a04735c1128f")

HMAC 第二個引數本身就是 Key 的意思,所以用在這裡恰到好處。

當然,如果不保護好演算法以至於很容易洩露,那麼無論用奇怪組合還是這種方式,也都無濟於事。

保護演算法

很多人對演算法保護的並不好,甚至直接寫在了諸如 PHP 腳本里,只要有檔案讀取許可權,就能搞到演算法。

如果稍加隱蔽,例如通過本地服務,並控制好可執行程式的許可權,或許就更難找到了。

更進一步,可以單獨部署一臺伺服器,專門提供 HMAC 計算。通訊介面足夠簡單,簡單到幾乎不可能出漏洞;並且不開放其他任何服務,只能人工管理。這樣,被入侵的可能性就更小了。

當然,管理員人為洩密也是有可能的。如果要有一個終極方案,或許應該將計算交給一個獨立的硬體。這個硬體是個黑盒裝置,輸入明文、輸出 Hash 結果。演算法、金鑰這些都隱藏在其內部,拆開即自毀,這樣管理員也無從知曉。例如 HSM(hardware security module)裝置,就能將演算法以及金鑰進行物理隔離。

  password  |-------------------------|
----------->|         黑盒裝置         |
            | KEY = ***************** |
<-----------| hmac_sha(password, KEY) |
    hash    |-------------------------|

其他策略

如果演算法能保證 100% 不洩露,那麼加鹽、慢 Hash 這些都可以省略了,因為金鑰本身就足以對抗暴力破解。

當然現實中沒有絕對的事。如果演算法真的洩露了,現有資料的風險就大幅增加。所以本該有的策略還是得有,不能把風險全押在一個點上。

所以加鹽、慢 hash 這些仍然是需要的。最終方案應該類似這樣:

# 業務邏輯
hash = pbkdf(password, salt, cost...)
            ↓
######## 隱蔽的黑盒系統 ########
hash = hmac(hash, KEY)
##############################
            ↓
# 返回業務

這樣即使黑盒演算法遭到洩露,破解仍然需要很大成本。

破解成本

不過,奇怪演算法也有一個優勢,那就是破解軟體支援程度不高。

傳統的權威演算法,早已成為眾矢之的,有各種高度優化的破解方案,因此破解速度會非常快;而奇怪演算法,則不在優化範圍中,因此速度會慢的多。

所以,在權威演算法之後,可以考慮再混合少量奇怪演算法。這樣,就能再增加一層破解障礙。

總結

  • 奇怪演算法是有意義的,但效果難以衡量

  • HMAC 的金鑰需要足夠長、足夠隨機、足夠保密

  • 保護好演算法,和保護資料庫同樣重要

相關推薦

複雜Hash 函式組合意義

很久以前看到一篇文章,講某個大網站儲存使用者口令時,會經過十分複雜的處理。怎麼個複雜不記得了,大概就是將口令先 Hash,結果加上一些特殊字元再 Hash,然後中間插入些字元再 Hash、再怎麼怎麼的。。。看的眼花繚亂。 當時心想這麼複雜應該很安全了吧。事實上即使現在,仍有不少人是這麼認為的。所以在儲存賬號口

當經濟好的時候,雲計算仍然意義

好處 變革 業務 能力 小鳥 合作 管理 2018年 屬於 經濟不景氣將使雲計算成為企業節約成本的最初動力,但經濟發展良好的時候應該意味著雲計算現在變得具有戰略意義。 如今,即使是美聯儲也在尋找減緩經濟速度的方法,因此經濟繁榮不會變得過熱然後崩潰。 良好經濟將如何影響雲計算

隨機數字生成器(RNG)和Hash函式組合武器背後的黑暗祕密

  文章題目之所以叫“黑暗祕密”,只是我覺得這個名字比較酷=。=然而並沒有涉及到太多背後的數學原理,只是對其分佈作了一些有趣的實驗~   進入正題,在遊戲程式設計當中,總是會不可避免地用上隨機數生成器(簡稱RNG,RandomNumberGenerator

程式設計師們,天天加班,真的意義

「 IT 行業加班到底有沒有價值?」 現在 IT 行業加班是普遍現象,然而加班是否能夠加快工作進度呢? 加班使人疲累,降低工作效率。 加班不給工資,降低士氣。 加班給福利,可能會有無效率的加班(賴著)。 某乎友據我所知,有不少 IT 公司是不加班的,然

常見的意義的英文變數名,類名,函式名的總結.

函式名  BubbleSort 冒泡法 變數名 index  陣列角標,可以給用來儲存陣列角標的常見變數名有  dex1 dex2 其他難以分類的一些單詞和簡寫,以後看機會採用. Division 除法,Div 整除 

Python了concurrent的話mutiprocessing和threading還有存在的意義

callback use The 是不是 sse ole span process sel Python3.2中引入的concurrent非常的好用,只用幾行代碼就可以編寫出線程池/進程池,並且計算型任務效率和mutiprocessing.pool提供的poll和Threa

北京賽車pk10改單穩贏技巧?公式計劃分享

不能 劃分 重要 存在 原理 眼界 貪心 學習 工作 平心而論,各種技巧和模式,北京賽車pk10改單Q564 097 898只要不是亂編造,都是有一定原理或道理的, 如前所述,技巧、模式都是成功的經驗總結,認真學習下總會有啟發,在學習的過程中, 結合自身特點,充分理解技巧的

金蝶K3很意義的數字3

金蝶 展期 mrp 供應鏈 k3 erp 金蝶公司的開發者對於3這個數字好像有特別的愛好,實際工作那麽 多年逐步發現金蝶 對於3有特別的意義 。 舉例:1、K3試期賬期,不能超過3期。2、總賬如果的結賬遲過其他財務模塊,例如出納模塊,那麽出納就不能結過3期的作業,或查詢。3、MR

嵌入式前途

d+ 現實 展示 中心 阿裏 基礎 就業 miui 2016年   嵌入式有前途嗎?作為一下正在學習嵌入式的新人,我堅信嵌入式的前途是非常好的。   嵌入式有沒有前途,我們先來看看智能硬件   智能硬件是一個科技概念,指通過將硬件和軟件相結合對傳統設備進行智能化改造。而智能

JLOI 2015--意義的字符串(矩陣乘法)

fine [1] ons tor http long clas 公式 per 知道公式就不難了系列。。。 感覺吉林省選好變態。。。這還只是第一題呀。。。 %dalaoPoPoQQQ。。。 看了大佬的題解。

報考通信考試條件?要怎麽樣的條件才能報考通信考試?

級別 專業 電信 targe mage 工業 hot 國家 opera 通信工程師考試簡介 通信專業技術人員職業水平考試(簡稱通信考試,通信專業考試,通信工程師考試)是由國家人力資源和社會保障部、工業和信息化部領導下的國家級考試,其目的是,科學、公正地對全國

論“java程序員的進階路途”如何做到少走彎路,多寫正確意義的代碼。

cto 優化 set 為什麽 偉大的 不同的 量化 不同 自己 首先說明一下我為什麽會去思考這個問題。本人離開學校也有一段時間了,經過了幾場面試幾次臨時抱佛腳還有遇到的種種問題之後,社會告訴了我,如何做到少走彎路?如何讓自己在何時去寫合適的代碼。其實在我看來這

【轉】編寫高質量代碼改善C#程序的157個建議——建議142:總是提供意義的命名

int 每一個 改善 public static col turn nds item 建議142:總是提供有意義的命名 除非有特殊原型,否則永遠不要為自己的代碼提供無意義的命名。 害怕需要過長的命名才能提供足夠的意義?不要怕,其實我們更介意的是在代碼的時候出現一個iT

意義的命令

pri gnu sleep str lis strong ont echo let 有意義的命令1、執行關於magnum所有的帶list的命令# for i in `magnum | grep list | awk '{print $1}'`;do echo

洛谷 P1426 小魚會危險【模擬/題意理解】

這一 space hid onclick 數據 display play ron 一次 題目描述 有一次,小魚要從A處沿直線往右邊遊,小魚第一秒可以遊7米,從第二秒開始每秒遊的距離只有前一秒的98%。有個極其邪惡的獵人在距離A處右邊s米的地方,安裝了一個隱蔽的探測器,

[JLOI2015]意義的字符串

同余 方程 問題 有意 pos ons brush 個數 out 4002: [JLOI2015]有意義的字符串 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1000 Solved: 436[Submit][Statu

中醫針灸抖針真的效果

中醫針灸 針灸抖針江蘇鹽城鞠長波提供:鞠長波是2015年3月份學得中華抖針,以前沒有任何的針灸基礎,學習三天後,回家開店。肩周炎,女,56歲,自述一年前擡東西肩部閃了一下,從此後慢慢開始疼痛,這兩個月來疼痛加重,胳膊不能上舉,不能後背,前後貼過膏藥無數,吃過藥,也找人推拿,但是越推越疼,做了一個星期推拿就

機械生產行業實施ERP系統對企業管理好處

erp軟件隨著工業4.0和互聯網+時代的到來,生產制造型企業適時導入ERP系統已是一種必然的趨勢和明智的選擇,據制造行業IT技術調查數據顯示,生產型企業實現信息化管理,ERP系統起絕對性作用,不僅解決了企業生產管理難題,還幫助企業實現了一體化管理。下面小編就以智邦國際ERP系統為例,為大家闡述一下ERP系統是

BZOJ_4002_[JLOI2015]意義的字符串_矩陣乘法

!= long clas mat img ont == memset tput BZOJ_4002_[JLOI2015]有意義的字符串_矩陣乘法 Description B 君有兩個好朋友,他們叫寧寧和冉冉。有一天,冉冉遇到了一個有趣的題目:輸入 b;d;n,求

雲計算市場怎麽樣?學雲計算前景

雲計算從全球範圍來看,雲服務已經成為企業IT的標準解決方案。在北美和歐洲 澳洲等經濟發達地區,B類客戶早就不糾結於到底上不上雲了,而是更多的在探討怎樣在雲上創建更豐富的SaaS應用和雲生態。簡而言之,市場已經成熟,不再需要去教育客戶,客戶需求和雲廠商形成了一個良好的正向循環。 阿裏雲市場現在的份額比2016年