ошибка: 040A1079: процедуры rsa: RSA_padding_check_PKCS1_OAEP_mgf1: ошибка декодирования oaep в AWS

#javascript #node.js #amazon-web-services #cryptojs

#javascript #node.js #amazon-веб-сервисы #криптоджейс

Вопрос:

Я использую пакет crypto для выполнения следующих действий :

  1. crypto.generateKeyPairSync() для генерации publicKey и PrivateKey
    • Я создал ключи только один раз и сохранил их в файле .env
  2. crypto.publicEncrypt() для шифрования данных перед их сохранением в базе данных
  3. crypto.privateDecrypt() для расшифровки данных для рендеринга на HTML-странице (рендеринг данных на HTML-странице предназначен только для проверки правильности хранения данных, позже я буду использовать privateDecrypt при входе в систему, чтобы проверить, действителен ли pw).

На моем локальном компьютере:

  1. Я могу зашифровать данные и сохранить их в БД
  2. Расшифруйте данные и отобразите их в HTML

Однако, если я попытаюсь расшифровать данные в экземпляре AWS EC2, я получаю следующую ошибку: ошибка: 040A1079: процедуры rsa: RSA_padding_check_PKCS1_OAEP_mgf1: ошибка декодирования oaep.

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

 const { generateKeyPairSync } = require('crypto');
const { publicKey, privateKey } = generateKeyPairSync('rsa', {
  modulusLength: 4096,
  publicKeyEncoding: {
    type: 'spki',
    format: 'pem'
  },
  privateKeyEncoding: {
    type: 'pkcs8',
    format: 'pem',
    cipher: 'aes-256-cbc',
    passphrase: 'top secret'
  }

const ENCRYPTED_pw = crypto.publicEncrypt(
                    {
                        key: PUBLIC_KEY,
                        padding: crypto.constants.RSA_PKCS1_OAEP_PADDING,
                        oaepHash: "sha256",
                    },
                    Buffer.from(body.pw)
                );
                //convert Array Buffer to String 
                let encryptedPW = ENCRYPTED_pw.toString("base64");
//INSERT data into DB HERE

//GET data from DB HERE

let decryptedPhoneNum = crypto.privateDecrypt(
                            {
                                key: PRIVATE_KEY,
                                padding: crypto.constants.RSA_PKCS1_OAEP_PADDING,
                                oaepHash: "sha256",
                            },
                            Buffer.from(result[i].pw, "base64")
                        );
});
 

Ответ №1:

(Я случайно увидел этот вопрос по пути, чтобы проверить другие вопросы. И написание этого мнения на всякий случай, если это может помочь вашей проблеме.)

Когда я увидел ваше сообщение об ошибке, я предположил, что с ним может быть проблема padding .

Итак, я проверил ваш padding: crypto.constants.RSA_PKCS1_OAEP_PADDING код и заметил, что crypto переменная никогда не объявлялась при ее импорте, скорее вы объявляли только generateKeyPairSync из crypto подобного,

 const { generateKeyPairSync } = require('crypto');
 

Следуя этой crypto части Node.js док, они объявляют crypto переменную в верхней части своего кода при импорте.

 const crypto = require('crypto');
 

Надеюсь, это может помочь вашей проблеме.

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

1. Код работает нормально локально, у меня просто возникла проблема, когда я пытаюсь запустить его с помощью экземпляра EC2 на AWS. Я привел только часть исходного кода, но спасибо, что упомянули об этом