Freitag, 28. Oktober 2011

Secret-Key Verschlüsselung/Entschlüsselung

Zuerst einmal muss das Passwort mit einem Salt versehen werden und aus diesem Pärchen mittels der SecretKeyFactoryein SecretKey erzeugt werden:
char[] password = "Test".toCharArray();
byte salt[] = new byte[] {0, 1 };

SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
KeySpec spec = new PBEKeySpec(password, salt, 1024, 256);
SecretKey tmp = factory.generateSecret(spec);
SecretKey secret = new SecretKeySpec(tmp.getEncoded(), "AES");
Im Beispiel ist das Salt fest - dieses sollte ansonsten natürlich zufällig erzeugt werden. Wichtig ist, dass bei einer zufälligen Erzeugung das Salt auch an die entschlüsselnde Partei übergeben werden muss. Der dritte Parameter der  PBEKeySpec gibt die Anzahl der Iterationen an, der vierte die Größe des Schlüssels. Die Größe des Schlüssels beeinflusst auch die Stärke des AES.

Für die Verschlüsselung wird nun die Cipher erzeugt und initialisiert.
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, secret);
Der Init-Vector muss sich gemerkt (und an die entschüsselnde Partei übergeben) werden! Dies kann z.B. geschehen, indem die Daten an den Anfang des Streams geschrieben werden.
AlgorithmParameters p = cipher.getParameters();
byte[] iv = p.getParameterSpec(IvParameterSpec.class).getIV();
Nun kann der Input (z.B. mit Hilfe eines CipherOutputStream) verschlüsselt werden:
CipherOutputStream cos = new CipherOutputStream(out, cipher);
cos.write("Test".getBytes("UTF-8"));
cos.close();
Zum Entschlüsseln muss die Cipher nun mit dem IV initialisiert werden:
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, secret, new IvParameterSpec(iv));
Danach kann (z.B. mit Hilfe eines CipherInputStream) die Entschlüsselung durchgeführt werden:
CipherInputStream cis = new CipherInputStream(in, cipher);
byte[] buffer = new byte[1024];
int readBytes = cis.read(buffer);

Donnerstag, 2. September 2010

Wie bekomme ich eine JMX Connection URL

Eine JMX Connection URL kann auf verschiedene Arten aufgesetzt werden. Leider ist bei den meisten ein fester RMI Port von Nöten. (Siehe z.B. hier).

Eine andere Lösung ist es, eine minimale URL zu verwenden und die Engine den Rest machen zu lassen. Dies führt zu folgendem Code:

MBeanServer mbs = MManagementFactory.getPlatformMBeanServer();
JMXServiceURL url = new JMXServiceURL("rmi", null, 0);
JMXConnectorServer server = JMXConnectorServerFactory.newJMXConnectorServer(url, null, mbs);
server.start();

url = server.getAddress();

Die URL wird dann durch eine kryptische URL ersetzt, mit der man sich auf den MBeanServer verbinden kann.

Wenn die PID des Prozesses des Prozesses bekannt ist, kann alternativ folgende Lösung verwendet werden. Diese benutzt jedoch interne sun Klassen.

Donnerstag, 5. August 2010

Session Management in Tomcat

Der Standard Manager versucht beim Shutdown die Sessions zu speichern. Wenn in der Session nicht serialisierbare Objekte enthalten sind, kommt es zu Fehlern.
Das Verhalten kann man abdrehen, indem man einen anderen Manager verwendet. Zum Beispiel mittels


<Context ...>
   <Manager pathname="" />
</context>

Mittwoch, 4. August 2010

Block-Editor in Eclipse

Um einen Block (Rectangle) in Eclipse zu selektieren, muss der Block-Edit Mode eingeschaltet werden. Dies geschieht entweder über das dazugehörige Icon oder über den Shortcut: Alt+Shift+A.

Wie fährt man Oracle herunter?

Stoppen des Listeners:
lsnrctl stop

Shutdown der Datenbank
sqlplus system as sysdba
shutdown

Befehlsliste für Services

invoke-rc.d
service SCRIPT CMD

Falls der Service ein Upstart Service ist, kann der aktuelle Status mit Hilfe dieses Befehls erfragt werden:
status SERVICE

Wie speichert man in vi als root?

Wenn man vi nicht als root gestartet hat, aber trotzdem die Datei als root speichern möchte, kann man folgenden Befehl verwenden:
:w !sudo tee %