keystore密钥文件使用的算法-PBKDF2WithHmacSHA1 和Scrypt
PBKDF2
简单而言就是将salted hash进行多次重复计算,这个次数是可选择的。如果计算一次所需要的时间是1微秒,那么计算1百万次就需要1秒钟。假如攻击一个密码所需的rainbow table有1千万条,建立所对应的rainbow table所需要的时间就是115天。这个代价足以让大部分的攻击者忘而生畏
实现:
P 口令,一字节串
S 盐值,字节串 salt
2. 假设l是导出密钥的hLen长度的字节块的个数,r表示最后一个块的字节数。
r = dkLen - (l - 1) * hLen .
T_2 = F (P, S, c, 2) ,
...
T_l = F (P, S, c, l) ,
U_2 = PRF (P, U_1) ,
...
U_c = PRF (P, U_{c-1}) .
{ "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算法会产生一个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 的主要目的是用来防止预先被计算好的彩虹表攻击。
现在加 salt 好处是将原本一次比较变为多次比较从而减慢对密码 Hash 值的猜测,否则对 Hash 密码库的破解效率将是非常之高。
bcrypt