Oracle
 sql >> Base de données >  >> RDS >> Oracle

Est-ce que quelqu'un sait quelle technique de cryptage JDeveloper/SQL Developer utilise pour conserver les informations d'identification ?

Pour les curieux, ce que vous voyez en réalité est la clé secrète concaténée avec le mot de passe crypté. Par exemple, j'ai essayé de crypter le mot de passe "VOILIER" en utilisant :

DatabaseProviderHelper.goingOut("SAILBOAT")

Dans ce cas particulier, le résultat était :

0527C290B40C41D71139B5E7A4446E94D7678359087249A463

Le premier octet est constant :

05

Les 8 octets suivants représentent la clé secrète générée aléatoirement (pour le chiffrement DES) :

27C290B40C41D711

Les octets restants sont le mot de passe crypté :

39B5E7A4446E94D7678359087249A463

Par conséquent, pour déchiffrer le mot de passe, il vous suffit d'utiliser ceci :

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);
}