我最近使用數字簽名,想弄清楚如何讓每個注冊的用戶都有自己的密鑰對用于編碼和解碼過程。我使用 Go 構建這種系統,并使用Go中的crypto/rsa 包。我已經閱讀了一些關于如何制作安全數字簽名并找到很多東西的文章。然后,我嘗試構建用于保護非對稱加密過程的第一件事。然后,我面臨的第一個問題是我問自己一個問題“我應該創建一個驗證,以確保沒有其他用戶擁有 RSA 包生成的密鑰對嗎?” 這樣可以確保每個用戶都不會因為他們擁有相同的密鑰對而意外或故意假裝為其他用戶(即使機會非常?。U埥o我一些關于這種情況的見解。如果我的問題不夠清楚,請隨時提出或投訴,我真的很難為我的用戶和系統考慮任何安全方面。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), })}
1 回答

米脂
TA貢獻1836條經驗 獲得超3個贊
不,你不應該。
主要是因為嚴格的私鑰比較是不夠的,你需要確保模數中的兩個素數不同。
第二個原因是它幾乎毫無意義:選擇相同素數的可能性非常低,你只是在浪費時間。
給定一個 4096 位 RSA 密鑰,您正在尋找兩個 2048 位素數。這些碰撞的可能性很小。
它可能有用的一種情況是,如果你的機器上有可怕的熵。但是你可能還有其他問題,這可能是一個單獨的問題。
有關模素數為何重要(與原始密鑰內容相反)的更多詳細信息,以及計算素數沖突可能性的詳細信息,請參閱此 security.se 問題。
第三個原因是它需要您保留所有用戶私鑰的參數。您絕對不應該,而且您可能一開始就不應該代表他們生成密鑰對。
- 1 回答
- 0 關注
- 207 瀏覽
添加回答
舉報
0/150
提交
取消