sql >> Base de Datos >  >> RDS >> Oracle

¿Alguien sabe qué técnica de cifrado está usando JDeveloper/SQL Developer para conservar las credenciales?

Para los curiosos, lo que en realidad está viendo es la clave secreta concatenada con la contraseña cifrada. Por ejemplo, intenté encriptar la contraseña "SAILBOAT" usando:

DatabaseProviderHelper.goingOut("SAILBOAT")

En este caso particular, el resultado fue:

0527C290B40C41D71139B5E7A4446E94D7678359087249A463

El primer byte es constante:

05

Los siguientes 8 bytes representan la clave secreta generada aleatoriamente (para el cifrado DES):

27C290B40C41D711

Los bytes restantes son la contraseña cifrada:

39B5E7A4446E94D7678359087249A463

Por lo tanto, para descifrar la contraseña, simplemente use esto:

public static byte[] decryptPassword(byte[] result) throws GeneralSecurityException {
    byte constant = result[0];
    if (constant != 5) {
        throw new IllegalArgumentException();
    }

    byte[] secretKey = new byte[8];
    System.arraycopy(result, 1, secretKey, 0, 8);

    byte[] encryptedPassword = new byte[result.length - 9];
    System.arraycopy(result, 9, encryptedPassword, 0, encryptedPassword.length);

    byte[] iv = new byte[8];
    for (int i = 0; i < iv.length; i++) {
        iv[i] = 0;
    }

    Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
    cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(secretKey, "DES"), new IvParameterSpec(iv));
    return cipher.doFinal(encryptedPassword);
}