簡單而言就是將salted hash進行屢次重複計算,這個次數是可選擇的。若是計算一次所須要的時間是1微秒,那麼計算1百萬次就須要1秒鐘。假如攻擊一個密碼所需的rainbow table有1千萬條,創建所對應的rainbow table所須要的時間就是115天。這個代價足以讓大部分的攻擊者忘而生畏html
實現:算法
{ "crypto":{ "cipher":"aes-128-ctr", "cipherparams":{ "iv":"6087dab2f9fdbbfaddc31a909735c1e6" }, "ciphertext":"5318b4d5bcd28de64ee5559e671353e16f075ecae9f99c7a79a38af5f869aa46", "kdf":"pbkdf2", "kdfparams":{ "c":262144,//迭代次數 "dklen":32,//導出密鑰的指定字節長度 "prf":"hmac-sha256",//基本僞隨機函數,用於迭代中的計算函數 "salt":"ae3cd4e7013836a3df6bd7241b12db061dbe2c6785853cce422d148a624ce0bd"//鹽值 }, "mac":"517ead924a9d0dc3124507e3393d175ce3ff7c1e96529c6c555ce9e51205e9b2" }, "id":"3198bc9c-6672-5ab3-d995-4942343ae5b6", "version":3 }
⚠️hmac是Hash-based Message Authentication Code的簡寫,就是指哈希消息認證碼,包含有不少種哈希加密算法,sha256是其中一種。因此hmac-sha256的意思就是使用sha256哈希算法數組
https://tools.ietf.org/html/rfc7914(RFC 7914《The scrypt Password-Based Key Derivation Function》關於算法的描述)安全
https://zhuanlan.zhihu.com/p/32484253函數
Scrypt算法會產生一個p個塊元素的數組,p的值大概比2^31(42億)小几個數量級,實際使用中多是十萬~百萬級別吧?對於每一個塊元素,都是進行一系列複雜運算生成的哈希值,最後對整個數組再進行PBKDF2-HMAC-SHA256運算獲得最終結果。工具
Scrypt算法保證只有將每一個元素都存放在內存中,最後才能算出正確的結果,從算法層面保證了對大量內存空間的硬需求,從而提升了運算成本。編碼
{ "address":"a9886ac7489ecbcbd79268a79ef00d940e5fe1f2", "crypto":{ "cipher":"aes-128-ctr", "cipherparams":{ "iv":"c542cf883299b5b0a29155091054028d" }, "ciphertext":"0a83c77235840cffcfcc5afe5908f2d7f89d7d54c4a796dfe2f193e90413ee9d", "kdf":"scrypt", "kdfparams":{ "dklen":32,//導出密鑰的指定字節長度 "n":262144,//迭代次數 "r":8,//底層哈希的塊大小。默認爲8 "p":1,//並行化的因素。默認爲1 "salt":"699f7bf5f6985068dfaaff9db3b06aea8fe3dd3140b3addb4e60620ee97a0316"//鹽值 }, "mac":"613fed2605240a2ff08b8d93ccc48c5b3d5023b7088189515d70df41d65f44de" }, "id":"0edf817a-ee0e-4e25-8314-1f9e88a60811", "version":3 }
salt 的定義是經過一個單向函數獲取隨機數據來爲密碼或口令添加一些額外的數據。更簡單的說法則是經過生成一些隨機的文本將其附加到密碼上來生成 Hash。加密
爲 Hash 加 salt 的主要目的是用來防止預先被計算好的彩虹表攻擊。spa
如今加 salt 好處是將本來一次比較變爲屢次比較從而減慢對密碼 Hash 值的猜想,不然對 Hash 密碼庫的破解效率將是很是之高。設計