RSA - Java - resolvido

Estou usando Intelbras HTTP API For DefenseIA_EN V2.0, e sua documentação em PDF

Fiz o login como usuário local, funcionando corretamente.

Agora tenho que fazer o login como domínio.

Mas de acordo com a documentação tem que ser com RSA

In the case of a domain user, the signature algorithm is different. signature
= RSA (password, platform public key). The platform public key is the same publickey returned in the first login.

Tentei de algumas formas. Mas para mim o erro está de como gerar o RSA.

Está assim:

private void loginProducao(final LoginDTO dto, final KeyPair keyPair, final Map<String, String> secondLoginParams) {
        try {
            final Cipher encryptCipher = Cipher.getInstance("RSA");
            encryptCipher.init(Cipher.ENCRYPT_MODE, keyPair.getPrivate());
            final byte[] senha = dto.getSenha().getBytes(UTF_8);
            final String encodedMessage = getEncoder().encodeToString(encryptCipher.doFinal(senha));
            log.info("logar - encodedMessage: " + encodedMessage);
            secondLoginParams.put(SIGNATURE2, encodedMessage);
        } catch (NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException | IllegalBlockSizeException | BadPaddingException e) {
            log.error(e.getMessage(), e);
        }
    }

O que pode estar errado ?

A mensagem de erro diz para você utilizar a chave pública retornada no primeiro login, você está fazendo a chamada de uma chave privada do keypair.

Já avaliou este ponto da sua implementação?

1 curtida

Este é o erro.

A chave publica é retornada do primeiro login

Tenho a senha do usuário que ele digitou.

O que não consegui fazer é fazer o RSA da senha com a chave publica do servidor e enviar para o segundo login.

Consegui assim

 try {
            final String publicKeyAsString = primeiroLogin.getString("publickey");
            final byte[] encKey = getDecoder().decode(publicKeyAsString);
            final EncodedKeySpec publicKeySpec = new X509EncodedKeySpec(encKey);
            final KeyFactory keyFactory = KeyFactory.getInstance("RSA");
            final PublicKey publicKey = keyFactory.generatePublic(publicKeySpec);
            final Cipher encryptCipher = Cipher.getInstance("RSA");
            encryptCipher.init(Cipher.ENCRYPT_MODE, publicKey);
            final byte[] senha = dto.getSenha().getBytes(UTF_8);
            final String encodedMessage = getEncoder().encodeToString(encryptCipher.doFinal(senha));
            segundoLogin.put(SIGNATURE2, encodedMessage);
            segundoLogin.put(USER_TYPE, "1");
        } catch (NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException | IllegalBlockSizeException | BadPaddingException e) {
            log.error(e.getMessage(), e);
        }