Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

179
Visualizações
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 Respostas
Responde à pergunta

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda