Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Weiß jemand, welche Verschlüsselungstechnik JDeveloper/SQL Developer verwendet, um Anmeldeinformationen beizubehalten?

Für die Neugierigen, was Sie tatsächlich sehen, ist der geheime Schlüssel, der mit dem verschlüsselten Passwort verkettet ist. Zum Beispiel habe ich versucht, das Passwort "SEGELBOOT" zu verschlüsseln mit:

DatabaseProviderHelper.goingOut("SAILBOAT")

In diesem speziellen Fall war das Ergebnis:

0527C290B40C41D71139B5E7A4446E94D7678359087249A463

Das erste Byte ist konstant:

05

Die nächsten 8 Bytes repräsentieren den zufällig generierten geheimen Schlüssel (für die DES-Chiffre):

27C290B40C41D711

Die restlichen Bytes sind das verschlüsselte Passwort:

39B5E7A4446E94D7678359087249A463

Um das Passwort zu entschlüsseln, verwenden Sie daher einfach Folgendes:

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