es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo encriptar con un certificado RSA en nodejs?

Estoy revisando algunos documentos donde se me solicita encriptar algunos datos utilizando un certificado. Los documentos dicen:

Encripta el array con el certificado de clave pública de M-Pesa. Utiliza el algoritmo RSA, y utiliza el relleno PKCS #1.5 (no OAEP), y agrega el resultado al flujo encriptado.

Luego continúa diciendo:

Convierte el array de bytes encriptados resultante en una cadena utilizando la codificación base64. La cadena resultante codificada en base64 es la credencial de seguridad.

Entonces, mis preguntas son:

  1. ¿Cómo puedo lograr esto en nodejs?
  2. He leído que un certificado contiene una clave pública. El certificado, además de contener la clave pública, contiene información adicional como el emisor, para qué se supone que se utilizará el certificado y otros tipos de metadatos. ¿Cuál es la ventaja de encriptar con un certificado en lugar de simplemente usar una clave pública? ¿O es lo mismo?
Tags:  , , , ,

Answer

  1. Avatar for davy.ai
    1. Para lograr esto en node.js, necesitas usar el módulo crypto incorporado. Aquí tienes un ejemplo de código para encriptar una matriz utilizando el certificado de clave pública de M-Pesa, utilizando el algoritmo RSA y el relleno PKCS #1.5, y luego convertir el resultado a codificación base64:
    const crypto = require('crypto');
    const publicKey = `-----BEGIN CERTIFICATE-----
    MIIDBzCCAe+gAwIBAgIIJ39BFFVSZD8wDQYJKoZIhvcNAQEFBQAwXTELMAkGA1UE
    BhMCQkMxDTALBgNVBAcMBEdhbGxpbzENMAsGA1UECgwEU2FmYXJpYzEPMA0GA1UE
    CwwGSUJNQ1NPUDEfMB0GA1UEAwwWU0FmYXJpYyBST09UMB4XDTE5MDUyMDIxMDAw
    OFoXDTI5MDQyMjIxMDAwOFowXTELMAkGA1UEBhMCQkMxDTALBgNVBAcMBEdhbGxp
    bzENMAsGA1UECgwEU2FmYXJpYzEPMA0GA1UECwwGSUJNQ1NPUDEfMB0GA1UEAwwW
    U0FmYXJpYyBST09UMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2oMF
    h4rc4Aq3T8W6OQwv97STO6ENrY3ih8DpH/ScvRhlR+Izg6mCJGje0wv76QUxxpDo
    lLld15W542cMHx0IJ0FmB+oee8mpettJiBwlcbr1/mnmdM+x+J9KuxBCcXd/NReg
    YWz+QyOF8TcfW2JwKTqU6IqGU3Y8fQBpKUJhRxF+LsUFzylpgulSI+ZCw77Rd/5S
    hJX9wybF2tbB7N06bv4C3q7krDaThgy483uA0VjCx37tBJYXl01NBx5lLm5p5z5c
    J/S/VO8mpOJ77CZhdDpMQUjxvJ8khNjfB92OQkkksk+dyWTwED8TJWq0cYI3riZm
    vUh8H1CEs+HK/gIDAQABoz4wPDAdBgNVHQ4EFgQUdmJg/bR/+xQ+X9nWn3h4si4g
    nH0wDQYJKoZIhvcNAQEFBQADggEBAGP/Mz5d5rl5f5tLZuV7L+YKZ2V7NKF/wx5u
    XHTGH5O12z5/5iLlIb0RndmguSgSIEyc/rmt/pHfAL2ByC0rz0qmm4Ng09hGatIf
    wT8Wn3qYcUJkm6fIxforv9XW1/vzEgxxoRDK11JjJO38oavPjkivlYpmlfu1xjQC
    9XRVdxIOCKtpPzOsFcuIwUOSWydjBpopNhq3b6UJ+gOxWj9pE0VkHJ/dRzjwSw/G
    eNcmNkO37GRCkE1f/0W/9X2cJbx/0MTr+jHUHQfLvkV7QbRxKthGt7ddOXcDDPz+
    X5B5pe5tb5CjpVVkEV1hTLpHMZSjNTliSyVLQbnx886GhcqcX1I=
    -----END CERTIFICATE-----`;
    
    const bufferToEncrypt = Buffer.from(JSON.stringify(['data', 'to', 'encrypt']));
    const encryptedData = crypto.publicEncrypt({
      key: publicKey,
      padding: crypto.constants.RSA_PKCS1_PADDING,
    }, bufferToEncrypt);
    const base64Encoded = encryptedData.toString('base64');
    console.log(base64Encoded); // esto es la credencial de seguridad
    

    Nota: Debes reemplazar publicKey con el certificado de clave pública de M-Pesa que te hayan proporcionado.

    1. Un certificado contiene una clave pública, pero también contiene información adicional como el emisor, para qué se supone que se utilizará el certificado y otros tipos de metadatos. La ventaja de encriptar con un certificado es que proporciona medidas de seguridad adicionales, como verificar la identidad de la autoridad de certificación y asegurarse de que el certificado siga siendo válido. Cuando encriptas algo usando un certificado, lo estás encriptando con la clave pública de ese certificado, pero también estás verificando que el certificado sea válido y no haya sido manipulado.

Comments are closed.