Go 如何检查随机性?
我正在使用BIP39规范生成12字助记符,该助记符稍后将用于生成主公钥/私钥及其2^32-1子密钥。然后,这些子密钥将用于非对称加密Go 如何检查随机性?,go,encryption,public-key-encryption,Go,Encryption,Public Key Encryption,我正在使用BIP39规范生成12字助记符,该助记符稍后将用于生成主公钥/私钥及其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 Pa
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个单词的助记符(这意味着熵函数的实现不正确,容易受到攻击)
我的问题是,当人们说密钥没有正确生成时
从随机函数很容易中断,他们实际上是什么
什么意思
在密码学中,坏随机性通过两种方式受到攻击:
这就是你所需要知道的——你不必担心其他任何事情。如上所述,无论测量多少熵都不能告诉您密钥是安全的。相反,您需要成为密码专家来分析此类算法。对于随机性的消费者来说,您所能做的(除了使用另一个源代码,如/dev/uradom)就是相信它设计得很好,并且经过了密码专家的分析。我要补充的是,“另一个源代码,如/dev/uradom”正是
crypto/rand
在许多系统上的实现方式crypto/rand
本身不实现任何随机数算法。它只是使用了最好的、非阻塞的、操作系统提供的随机性源。(在现代操作系统中,阻塞和非阻塞之间的区别通常并不重要,但过去是如此。)这样,如果您的系统改进了其RNG(通过操作系统升级或硬件访问高级熵源),则crypto/rand
的所有用户都可以免费获取它正是在许多系统上实现crypto/rand
的方式crypto/rand
本身不实现任何随机数算法。它只是使用了最好的、非阻塞的、操作系统提供的随机性源。(在现代操作系统中,阻塞和非阻塞之间的区别通常并不重要,但过去是如此。)这样,如果您的系统改进了其RNG(通过操作系统升级或硬件访问高级熵源),crypto/rand
的所有用户都可以免费获取它。我投票关闭这个问题,因为它涉及密码分析,而不是编程。尽管您的项目涉及代码,但您似乎并没有停留在编程步骤上,而是停留在熵的统计评估上。您可以尝试加密堆栈交换或交叉验证(统计堆栈交换)。一定要阅读他们的“如何提问”帮助页面,不要只是将这个问题复制粘贴到一个新网站上。我投票关闭这个问题,因为它涉及密码分析,而不是编程。尽管您的项目涉及代码,但您似乎并没有停留在编程步骤上,而是停留在熵的统计评估上。你可以试试