Должен ли я выполнить проверку для пар ключей пользователя, сгенерированных пакетом RSA, что пары ключей уникальны (у других пользователей нет одинаковых пар ключей)?

#validation #security #&o #crypto&raphy #rsa

#валидация #Безопасность #Вперед #криптография #rsa

Вопрос:

Недавно я работал с цифровой подписью и хочу выяснить, как сделать так, чтобы у каждого зарегистрированного пользователя были свои собственные пары ключей для процесса кодирования и декодирования. Я создаю систему такого типа с помощью Go, и я использую пакет crypto / rsa из Go. Я уже прочитал несколько статей о том, как создать безопасную цифровую подпись и найти много чего подобного. Затем я пытаюсь создать первое средство для защиты процесса, который является асимметричным шифрованием.

Тогда первая проблема, с которой я сталкиваюсь, заключается в том, что я задаю себе вопрос «Должен ли я создать проверку того, что ни у одного другого пользователя нет пар ключей, сгенерированных пакетом RSA?» чтобы гарантировать, что каждый пользователь не сможет притворяться другим пользователем случайно или специально, потому что у них одинаковые пары ключей (даже если вероятность действительно мала).

Пожалуйста, дайте мне некоторое представление о подобной ситуации. Если мой вопрос недостаточно ясен, не стесняйтесь спрашивать или жаловаться, мне действительно трудно думать о каком-либо аспекте безопасности для моего пользователя и системы.

 import (
    "crypto/rand"
    "crypto/rsa"
    "encodin&/pem"
    ...
)
...
func createKeyPairs(userRe&istered *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(userRequestin&CA.ID   "PrivateKey.pem")
    pem.Encode(caPrivateKeyPEMFile, amp;pem.Block{
        Type:  "RSA PRIVATE KEY",
        Bytes: x509.MarshalPKCS1PrivateKey(keyPairs),
    })

    caPublicKeyPEMFile, err := os.Create(userRequestin&CA.ID   "PublicKey.pem")
    pem.Encode(caPublicKeyPEMFile, amp;pem.Block{
        Type:  "RSA PUBLIC KEY",
        Bytes: x509.MarshalPKCS1PublicKey(amp;keyPairs.PublicKey),
    })
}
  

Комментарии:

1. я бы не доверял приложению, которое записывает мой закрытый ключ от моего имени. просто говорю.

2. Приведенный ниже ответ Марка объясняет, почему это не очень хорошая идея. Я также не понимаю, как это предотвращает наиболее очевидный способ, которым пользователи могли бы маскироваться друг под друга, обмениваясь учетными данными учетной записи. Наконец, даже если бы вы сделали это, я, вероятно, мог бы опровергнуть вашу проверку с помощью небольшого трюка с теорией чисел, и я, конечно, не самый острый инструмент в сарае.

Ответ №1:

Нет, вы не должны.

Главным образом потому, что строгого сравнения закрытых ключей недостаточно, вам нужно будет убедиться, что два простых числа в модуле отличаются.

Вторая причина заключается в том, что это было бы в основном бессмысленно: вероятность выбора одних и тех же простых чисел невероятно мала, вы бы просто потратили свое время.

Учитывая 4096-битный ключ RSA, вы ищете два 2048-битных простых числа. Вероятность столкновения для них астрономически мала.

Один случай, когда это могло бы быть полезным, — это если бы у вас была ужасная энтропия на вашем компьютере. Но тогда у вас, вероятно, есть и другие проблемы, и это, вероятно, отдельный вопрос.

Для получения более подробной информации о том, почему важны простые числа по модулю (в отличие от содержимого необработанного ключа), и подробностей о вычислении вероятности простых столкновений, пожалуйста, смотрите Это security.se вопрос.

Третья причина заключается в том, что это потребует от вас сохранения параметров закрытых ключей всех пользователей. Вы определенно не должны и, вероятно, вам вообще не следует генерировать пары ключей от их имени.