【发布时间】:2018-11-22 00:54:56
【问题描述】:
根据doc一个简单的例子,用PBKDF2导出密码是
return window.crypto.subtle.importKey(
'raw',
encoder.encode(password),
{name: 'PBKDF2'},
false,
['deriveBits', 'deriveKey']
).then(function(key) {
return window.crypto.subtle.deriveKey(
{ "name": 'PBKDF2',
"salt": encoder.encode(salt),
"iterations": iterations,
"hash": 'SHA-256'
},
key,
{ "name": 'AES-CTR', "length": 128 }, //api requires this to be set
true, //extractable
[ "encrypt", "decrypt" ] //allowed functions
)
}).then(function (webKey) {
return crypto.subtle.exportKey("raw", webKey);
})
正如人们所看到的,API 允许您选择:
- 密钥派生函数(及其底层哈希)
- 盐
- 迭代
- 原始密钥材料(即密码)
但据我所知,没有选择外长的选项。 似乎密码套件参数{ "name": 'AES-CTR', "length": 128 }会影响输出长度,但您只能选择16和32字节。
例如 10,000 轮,salt: 'salt', password: 'key material' 为 128 会产生以下 16 个字节:
26629f0e2b7b14ed4b84daa8071c648c
而{ "name": 'AES-CTR', "length": 256 } 你会得到
26629f0e2b7b14ed4b84daa8071c648c648d2cce067f93e2c5bde0c620030521
如何将输出长度设置为 16 或 32 字节?我必须自己截断它吗?
【问题讨论】:
标签: javascript pbkdf2 webcrypto-api