keystore密鑰文件使用的算法-PBKDF2WithHmacSHA1 和Scrypt

PBKDF2

簡單而言就是將salted hash進行屢次重複計算,這個次數是可選擇的。若是計算一次所須要的時間是1微秒,那麼計算1百萬次就須要1秒鐘。假如攻擊一個密碼所需的rainbow table有1千萬條,創建所對應的rainbow table所須要的時間就是115天。這個代價足以讓大部分的攻擊者忘而生畏html

實現:算法

DK = PBKDF2(P,S,c,dkLen)
可選項: RPF 基本僞隨機函數(hLen表示僞隨機函數輸出的字節長度)
輸入:
  P 口令,一字節串
  S 鹽值,字節串 salt
  c 迭代次數,正整數
  dkLen 導出密鑰的指定字節長度,正整數,最大約(2^32-1)*hLen
輸出: DK 導出密鑰,長度dkLen字節
 
步驟:
1. 若是dkLen>(2^32-1)*hLen,輸出「derived key too long」並中止。
2. 假設l是導出密鑰的hLen長度的字節塊的個數,r表示最後一個塊的字節數。
  l = CEIL (dkLen / hLen) ,
  r = dkLen - (l - 1) * hLen .
  這裏,CEIL(x)是「ceiling」函數,即,大於或等於x的最小整數。
3. 對於導出密鑰的每一塊,運用函數F於口令P、鹽S、迭代次數c和塊索引以計算塊:
  T_1 = F (P, S, c, 1) ,
  T_2 = F (P, S, c, 2) ,
  ...
  T_l = F (P, S, c, l) ,
  這裏函數F定義爲基本僞隨機函數PRF應用於口令P和鹽S的串聯和塊索引i的前c次循環的異或和。
  F (P, S, c, i) = U_1 \xor U_2 \xor ... \xor U_c
  其中
  U_1 = PRF (P, S || INT (i)) ,
  U_2 = PRF (P, U_1) ,
  ...
  U_c = PRF (P, U_{c-1}) .
  這裏,INT(i)是整數i的四字節編碼,高字節在先。
4. 串聯各塊,抽取前dkLen字節以產生導出密鑰DK:
  DK = T_1 || T_2 || ... || T_l<0..r-1>
5. 輸出導出密鑰DK。
  注意:函數F的構造遵循「belt-and-suspenders」方法。U_i次循環被遞歸計算以消除敵手的並行度;它們被異或到一塊兒以減小有關遞歸退化到一個小的值集的擔心。
{
  "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哈希算法數組

 

scrypt

https://tools.ietf.org/html/rfc7914(RFC 7914《The scrypt Password-Based Key Derivation Function》關於算法的描述)安全

https://zhuanlan.zhihu.com/p/32484253函數

scrypt是由著名的 FreeBSD黑客 Colin Percival爲他的備份服務 Tarsnap開發的。
和上述兩種方案不一樣, scrypt不只計算所需時間長,並且佔用的內存也多,使得 並行計算多個摘要異常困難,所以利用rainbow table進行暴力攻擊更加困難。scrypt沒有在生產環境中大規模應用,而且缺少仔細的審察和普遍的函數庫支持。可是,scrypt在算法層面只要沒有破綻,它的安全性應該高於PBKDF2和bcrypt。
 

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 密碼庫的破解效率將是很是之高。設計

bcrypt

bcrypt是專門爲密碼存儲而設計的算法,基於 Blowfish加密算法變形而來,由Niels Provos和David Mazières發表於1999年的USENIX。
bcrypt最大的好處是有一個參數(work factor),可用於調整計算強度,並且work factor是包括在輸出的摘要中的。隨着攻擊者計算能力的提升,使用者能夠逐步增大work factor,並且不會影響已有用戶的登錄。
bcrypt通過了不少安全專家的仔細分析,使用在以安全著稱的OpenBSD中,通常認爲它比PBKDF2更能承受隨着計算能力增強而帶來的風險。bcrypt也有普遍的函數庫支持,所以咱們建議使用這種方式存儲密碼。
 
有一個在線的哈希加密工具https://1024tools.com/hmac
相關文章
相關標籤/搜索