Go的ed25519包公开了一个函数,该函数允许从32字节种子创建私钥。
请参阅:https://godoc.org/golang.org/x/crypto/ed25519#NewKeyFromSeed
我之所以要使用它,是因为它只有32个字节,因此很容易复制和传递。
我假设如果我为种子使用密码安全的随机源,我在ed25519密钥的安全性方面应该是安全的。
(理想情况下,如果可以的话,我会做得更小,而不会在安全问题上妥协)。
现在,我想从我已经拥有的32个字节(或者种子生成的pub/priv密钥)中派生一个AES密钥来进行加密。
我希望任何拥有种子(或私钥)的人都能这样做。
现在可能有三种类型的客户:
为此,我如何安全地导出AES密钥?
我的直觉是在pbkdf2密钥的私有部分使用ed25519来生成AES密钥,但我不确定它是否削弱了安全性。
在种子上使用pbkdf2会使安全性受到更大的损害吗?
发布于 2019-11-08 21:14:11
您应该选择一个基于密钥的密钥派生函数,例如HKDF 256.然后:
info参数的提取器,用于每个不同的目的。您可以根据需要组织树,以便分发具有部分权限的子树,比如签名的权限(发出k_0,而不是k或k_1),或者加密/解密的权限(发出k_1,而不是k或k_0)。
任何其他合理的键控XOF,如SHA-3的KMAC128或键控BLAKE2x,也将提供服务。具有固定长度的输出(如HMAC 256或键控BLAKE2s )的函数在您需要的情况下稍微少了一些,例如,由于某种原因,64字节键而不是32字节密钥;HKDF是将这些键转换为可变长度输出的通用方法。HKDF还包括一个可选的初始步骤,HKDF-提取,将非均匀但高熵的种子(如计算机生成的BIP39密码)转换为有效的统一随机主密钥。
不需要基于密码的密钥派生函数(或者仅仅是“密码散列”),比如PBKDF2,因为输入--您的32字节主键--已经是一个统一的随机位字符串。您真正需要的是派生子键--k_0、k_1等--它们显然是独立的。
https://crypto.stackexchange.com/questions/75614
复制相似问题