我正在使用 dart pointycastle 库(基于 java bouncycastle)编写一个小库。
这些库不包含任何将私钥写入磁盘的方法。
所以我需要先用密码加密后将密钥写入磁盘。
我采取的方法是:
- 将键的每个组件(模数、指数...)编码为 base64 字符串(从 bigint 转换)
- 将每个 base 64 编码组件写入一个公共字符串
- 使用 AES 加密公共字符串
- base64 编码结果
- 将 base 64 编码结果写入文件。
这是否被认为是存储私钥的安全方式。
我发现我用来将密码短语延长到 128 位的这段代码:
Key stretch(int desiredKeyLength,
{int iterationCount = 100, Uint8List salt}) {
if (salt == null) {
salt = SecureRandom(desiredKeyLength).bytes;
}
final params = Pbkdf2Parameters(salt, iterationCount, desiredKeyLength);
final pbkdf2 = PBKDF2KeyDerivator(Mac('SHA-1/HMAC'))..init(params);
return Key(pbkdf2.process(_bytes));
}
这足够吗?