私は最近デジタル署名を使って作業していますが、登録した各ユーザーがエンコードおよびデコードプロセス用に独自のキーペアを作成する方法を理解したいと考えています。私はGoを使用してこの種のシステムを構築しており、Goのcrypto / rsaパッケージを使用しています。安全なデジタル署名を作成する方法や、さまざまなものを見つける方法についての記事をすでに読んだことがあります。次に、非対称暗号化であるプロセスをセキュリティで保護するための最初のものを構築しようとします。
次に、私が直面している最初の問題は、「RSAパッケージによって生成されたキーペアを他のユーザーが持っていないことを検証する必要がありますか?」そうすることで、同じキーのペアを持っているため、偶然または故意に各ユーザーが他のユーザーのふりをすることはありません(たとえチャンスが非常に小さくても)。
このような状況について少し教えてください。私の質問が十分に明確でない場合は、気軽に質問したり、苦情を言ったりすると、ユーザーとシステムのセキュリティの側面について考えるのに苦労します。
import (
"crypto/rand"
"crypto/rsa"
"encoding/pem"
...
)
...
func createKeyPairs(userRegistered *User) (err error) {
keyPairs, err := rsa.GenerateKey(rand.Reader, 4096)
if err != nil {
return err
}
// SHOULD I ADD SOME VALIDATION FOR THE KEYPAIRS GENERATED BY CRYPTO RSA AND RAND PACKAGE HERE
caPrivateKeyPEMFile, err := os.Create(userRequestingCA.ID + "PrivateKey.pem")
pem.Encode(caPrivateKeyPEMFile, &pem.Block{
Type: "RSA PRIVATE KEY",
Bytes: x509.MarshalPKCS1PrivateKey(keyPairs),
})
caPublicKeyPEMFile, err := os.Create(userRequestingCA.ID + "PublicKey.pem")
pem.Encode(caPublicKeyPEMFile, &pem.Block{
Type: "RSA PUBLIC KEY",
Bytes: x509.MarshalPKCS1PublicKey(&keyPairs.PublicKey),
})
}
いいえ、すべきではありません。
主に厳密な秘密鍵の比較では十分ではないため、係数の2つの素数が異なることを確認する必要があります。
2番目の理由は、それがほとんど無意味であることです。同じ素数を選択する可能性は信じられないほど低く、単に時間を浪費しているだけです。
4096ビットのRSA鍵があるとすると、2つの2048ビットの素数を探していることになります。それらの衝突の可能性は天文学的に小さいです。
あなたのマシンにひどいエントロピーがあった場合、それが役立つかもしれない一つのケースでしょう。しかし、おそらく他の問題もあるでしょう。それはおそらく別の問題です。
モジュラスプライムが重要な理由(未加工のキーコンテンツではなく)の詳細、およびプライムコリジョンの可能性の計算の詳細については、このsecurity.seの質問を参照してください。
3番目の理由は、すべてのユーザーの秘密鍵のパラメーターを保持する必要があることです。あなたは間違いなくそうすべきではありませんし、そもそも彼らに代わってキーペアを生成すべきではないでしょう。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加