Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

174
Vistas
Fallo de descifrado de RSA entre Java y el navegador usando web crypto api

Estoy tratando de obtener una respuesta cifrada del servidor usando la clave pública RSA. El cifrado se genera en el lado del servidor, pero falla la decodificación en el lado del cliente. Web crypto API arroja una excepción DOM.

servidor Java:

 byte[] exponentBytes = Base64.getUrlDecoder().decode(body.exponent); byte[] modulusBytes = Base64.getUrlDecoder().decode(body.modulus); BigInteger exponent = new BigInteger(1, exponentBytes); BigInteger modulus = new BigInteger(1, modulusBytes); RSAPublicKeySpec spec = new RSAPublicKeySpec(modulus, exponent); KeyFactory factory = KeyFactory.getInstance("RSA"); PublicKey publicKey = factory.generatePublic(spec); Cipher cipher = Cipher.getInstance("RSA"); cipher.init(Cipher.ENCRYPT_MODE, publicKey); byte[] cipherBytes = cipher.doFinal("hello".getBytes()) return Base64.getEncoder().encodeToString(cipherBytes);

Navegador:

 const key = await window.crypto.subtle.generateKey( { name: 'RSA-OAEP', modulusLength: 512, publicExponent: new Uint8Array([1, 0, 1]), hash: 'SHA-256', }, true, ['encrypt', 'decrypt'], ) const jwk = await window.subtle.exportKey('jwk', key.publicKey); const response = await fetch('/foo/bar', { method: 'post', body: { exponent: jwk.e, modulus: jwk.n } }); const body = await response.text(); const binary = window.atob(body); const bytes = new Uint8Array(binary.length); for (let i = 0; i < binary.length; i++) { bytes[i] = binary.charCodeAt(i); } await window.crypto.subtle.decrypt( { name: 'RSA-OAEP' }, key.privateKey, bytes.buffer, ); // returns undefined throws the error

EDITAR: Después de más investigaciones, descubrí que:

  1. (Obviamente) el cifrado generado por web crypto api no tiene problemas con la decodificación.
  2. Devolver la matriz de bytes en sí misma desde el lado del servidor no ayuda.
about 4 years ago · Juan Pablo Isaza
1 Respuestas
Responde la pregunta

0

En Webcrypto-lado que está utilizando

 name: 'RSA-OAEP', hash: 'SHA-256', ...

para instanciar el algoritmo. En el lado de Java, "simplemente" crea una instancia del cifrado con

 Cipher cipher = Cipher.getInstance("RSA");

pero ese es el sinonimo de

 Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1PADDING");

Debe usar esas líneas para crear una instancia del algoritmo Webcrypto:

 Cipher encryptCipher = Cipher.getInstance("RSA/ECB/OAEPWithSHA-256AndMGF1Padding"); OAEPParameterSpec oaepParameterSpecJCE = new OAEPParameterSpec("SHA-256", "MGF1", MGF1ParameterSpec.SHA256, PSource.PSpecified.DEFAULT); encryptCipher.init(Cipher.ENCRYPT_MODE, publicKey, oaepParameterSpecJCE); ciphertextByte = encryptCipher.doFinal(plaintextByte);

Nota de seguridad: una longitud de clave de 512 no es SEGURA , use una longitud de clave mínima de 2048 bits.

about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda