我正在使用BIP39规范生成12个字的助记符,后来用于生成Master Public / Private及其2 ^ 32-1子密钥。然后,这些子密钥将用于非对称加密。
import (
"github.com/tyler-smith/go-bip39"
"github.com/tyler-smith/go-bip32"
b64 "encoding/base64"
)
type BipKeys struct {
Entropy []byte
Mnemonic string
Passphrase []byte
Seed []byte
MnemonicShares []string
RootPublicExtendedKey *bip32.Key
RootPrivateExtendedKey *bip32.Key
RootPrivateHexKey string
}
func(instance *BipKeys) GenerateEntropy(numberOfBytes int)([]byte, error){
entropy, err := bip39.NewEntropy(numberOfBytes)
if err != nil {
log.Printf("There is some error generating entropy %s", err)
}
return entropy, err
}
func (instance *BipKeys) GenerateMnemonic(entropy []byte) (string, error){
mnemonic, err := bip39.NewMnemonic(entropy)
if err != nil {
log.Printf("Some error in generating Mnemonic %s", err)
}
return mnemonic, err
}
func (instance *BipKeys) GeneratePassphrase(saltBytes int, passphraseBytes int) ([]byte, error){
salt := GenerateRandomSalt(8)
passphrase := GenerateRandomString(8)
password, err := GenerateScryptKey(salt, []byte(passphrase))
return password, err
}
GenerateRandomString和GenerateRandomSalt只根据crypto / rand包生成随机字符串和字节。
我的问题是,当人们说从随机函数无法正确生成的密钥容易中断时,它们究竟意味着什么?如何检查bip39.NewEntropy(numberOfBytes)实际上是否产生了助记符所需的完美熵?有没有什么方法可以检查是否可以通过暴露前5个单词来生成12个字的助记符(这意味着熵函数实现不正确且容易受到攻击)?
我的问题是,当人们说从随机函数无法正确生成的密钥容易中断时,它们究竟意味着什么?
密码学中的不良随机性受到两种方式的攻击:
关于测量熵的问题是错误的问题。测量熵就像是一个统计随机数生成器一样对待它,而不像加密随机数生成器。你说:
GenerateRandomString和GenerateRandomSalt只根据crypto / rand包生成随机字符串和字节。
这就是你需要知道的 - 你不应该担心别的什么。如上所述,没有多少测量熵会告诉您钥匙是安全的。相反,您需要成为加密专家来分析此类算法。对于具有随机性的消费者,您所能做的就是(不使用其他来源,例如/ dev / urandom),相信这个设计得很好,并由加密专家进行分析。