登录
首页 >  Golang >  Go问答

是否有必要对生成的RSA用户密钥对进行验证,以确保其唯一性?

来源:stackoverflow

时间:2024-03-09 20:24:28 208浏览 收藏

小伙伴们对Golang编程感兴趣吗?是否正在学习相关知识点?如果是,那么本文《是否有必要对生成的RSA用户密钥对进行验证,以确保其唯一性?》,就很适合你,本篇文章讲解的知识点主要包括。在之后的文章中也会多多分享相关知识点,希望对大家的知识积累有所帮助!

问题内容

我最近正在研究数字签名,并想弄清楚如何使每个注册用户都拥有自己的密钥对以进行编码和解码过程。我使用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),
    })
}

解决方案


不,你不应该。

主要是因为严格的私钥比较是不够的,您需要确保模数中的两个素数不同。

第二个原因是这几乎毫无意义:选择相同素数的可能性非常低,你只是在浪费时间。

给定 4096 位 RSA 密钥,您正在寻找两个 2048 位素数。这些碰撞的可能性非常小。

可能有用的一种情况是,如果你的机器上有可怕的熵。但是您可能还有其他问题,这可能是一个单独的问题。

有关为什么模素数如此重要(相对于原始密钥内容)以及计算素数碰撞可能性的详细信息,请参阅 this security.se question

第三个原因是它会要求您保留所有用户私钥的参数。您绝对不应该这样做,而且您可能一开始就不应该代表他们生成密钥对。

好了,本文到此结束,带大家了解了《是否有必要对生成的RSA用户密钥对进行验证,以确保其唯一性?》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多Golang知识!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>