Dienstag, 29. März 2011

Passwörter hashen, salzen, speichern

Vor einiger Zeit habe ich mich ja schon mal über Passwörter in Webanwendungen ausgelassen. Eigentlich ist ohnehin Konsens, dass Passwörter nicht im Klartext in die Datenbank geschrieben werden sollten. Besser ist es einen Hash aus dem Passwort zu erzeugen, der dann nur noch beim Authentifizieren verglichen wird. Weil beim Knacken von Passwörtern aber auch auf Fertig-Hashes zurückgegriffen werden kann, macht es Sinn einen weiteren, zufälligen Wert zum Hashen des Passworts hinzuzuziehen - den Salt. Der Salt muss zwar ebenfalls bei jeder Authentifizierung bereit stehen und gespeichert werden, trotzdem erschwert der Salt das Knacken. Der Salt wird für jedes Passwort zufällig erzeugt, so das selbst die Hashes identischer Passwörter unterschiedlich sind. Um das an einem Beispiel zu zeigen, habe ich mal was vorbereitet (Die Hilfsmethoden- und Klassen folgen am Ende des Beitrags):

public SaltedPass flavorWithSalt(String passwd) throws Exception {
  final Random rand = new Random();
  final MessageDigest m = MessageDigest.getInstance("MD5");
  final byte[] salt = new byte[12];

  rand.nextBytes(salt);
  m.update(salt);
  m.update(passwd.getBytes("UTF8"));
  byte hash[] = m.digest();

  return new SaltedPass(toHex(salt), toHex(hash));
}

Der Methode flavorWithSalt wird das gewünschte Benutzerpasswort im Klartext übergeben. Die Methode generiert einen Zufallswert, der als Salt verwendet und beim Hashen einbezogen wird, sowie den Hash selbst. Die Anwendung darf nur den zurückgegeben Hash und den Salt speichern.

Für die Authentifizierung ist die Passworteingabe im Klartext und der Salt erforderlich. Beides ergibt wieder einen Hash, der mit dem gespeicherten Hash verglichen wird. Sind die Hashes identisch, ist die Authentifizierung erfolgreich.

public boolean validate(String passwd, SaltedPass flavored) throws Exception {
  final MessageDigest m = MessageDigest.getInstance("MD5");
  final byte[] salt = fromHex(flavored.salt);

  m.update(salt);
  m.update(passwd.getBytes("UTF8"));
  byte hash[] = m.digest();
  if(toHex(hash).equals(flavored.hash)) {
    return true;
  }
  return false;
}

Damit das ganze compiliert, sind noch die Methoden zum Wandeln der Byte-Arrays in ihre hexadezimale String-Representation und zurück, sowie die Klasse SaltedPass, die als Dataholder dient, erforderlich.

private String toHex(byte[] bytes) {
  final StringBuilder result = new StringBuilder(bytes.length * 2);
  for (int i = 0; i < bytes.length; i++) {
    result.append(Integer.toHexString((0x000000ff & bytes[i]) |   0xffffff00).substring(6));
  }
  return result.toString();
}

public static byte[] fromHex(String hexString) {
  final char[] hex = hexString.toCharArray();
  final int length = hex.length / 2;
  final byte[] raw = new byte[length];

  for (int i = 0; i < length; i++) {
    int high = Character.digit(hex[i * 2], 16);
    int low = Character.digit(hex[i * 2 + 1], 16);
    int value = (high << 4) | low;
    if (value > 127) {
      value -= 256;
    }
    raw[i] = (byte) value;
  }
  return raw;
}

private class SaltedPass {
  private String salt;
  private String hash;

  SaltedPass(String salt, String hash) {
    this.salt=salt;
    this.hash = hash;
  }

  public String toString() {
    return "salt:" + salt + " hash:" + hash;
  }
}

Und zuletzt noch die Main-Methode zum Ausprobieren:

public static void main(String[] args) throws Exception {
  String pass = "testpass";
  SaltedPass flavorWithSalt = new SaltTrialout().flavorWithSalt(pass);
  System.out.println(flavorWithSalt);

  boolean validate = new SaltTrialout().validate(pass, flavorWithSalt);
  System.out.println(validate);
}

Update 30.3.11
Source zum Download

Montag, 28. März 2011

Kostenlose E-Book Software zum lesen und bearbeiten

Trotz des mageren Buch-Angebots werden E-Books auch in Deutschland allmählich populärer. Ich nenne seit letztem Jahr ein Pocketbook 902 mein eigen. Deshalb heute ein paar Software-Tips für Programme, die sich inzwischen als nützlich erwiesen haben.

Beim Thema E-Book muss man natürlich mit Calibre den Anfang machen. Eine Software zum Verwalten und Konvertieren von E-Books. Calibre ist wohl das prominenteste Programm, wenn es um E-Books geht. Eine freie alternative für Verwaltung und Konvertierung gibt es wohl nicht, was ich schade finde, weil mir die Software nicht besonders gefällt. Sie ist weder besonders intuitiv, noch sonderlich gut in der Handhabung. Füttert man Calibre mit Büchern, werden diese indiziert und in ein eigenes Verzeichnis abgelegt. In das Verzeichnis gucken möchte man lieber nicht. Will man seine Bücher in eine eigene Verzeichnishierarchie ablegen, kann man Calibre als Verwaltungstool im Grunde vergessen.

Das für Lesegeräte geläufigste Buchformat ist wohl Epub. Das Format fühlt sich nicht an einen festen Textfluss gebunden und besteht im Wesentlichen aus einer Ansammlung von HTML, CSS und XML-Dateien.

Zum Überführen von Inhalten in das Epub-Format hat sich für mich Sigil als der ideale Arbeitsbegleiter erwiesen. Sigil ist so etwas, wie ein WYSIWYG-Editor für epubs. Inhalte finden so per Copy&Paste ihren Weg in das Epub, so das ich sie später locker auf dem Pocketbook lesen kann. Auch sonst bringt Sigil alles mit, was für die Epub-Erstellung so notwendig ist.

Wenn man ein paar Bücher sichten, oder mal eben am Arbeitsplatz ohne Lesegerät lesen möchte, ist Lesesoftware für den Desktop nötig. Hier führt wohl FBReader wieder die Bekanntheitsliste an. Man merkt aber sehr deutlich, dass FBReader eigentlich nicht für den Desktop, sondern für Lesegeräte gedacht ist. Weil ich die Software unhandlich fand und manche epubs auch nicht so recht mit FBReader wollen, habe ich mangels alternative auf das Firefox-Plugin EPUBReader zurückgegriffen. Vor einiger Zeit bin ich dann noch auf die Lesesoftware Coolreader gestoßen. Ähnlich wie FBReader ist Coolreader eigentlich für Lesegeräte gedacht, das Interface ist aber besser für den Desktopeinsatz geeignet. Heute bin ich noch auf die Lesesoftware Lucidor aufmerksam geworden. Lucidor enthält außerdem eine ganz ordentliche Katalogfunktion, die aber nur Epub-Dateien abdeckt. Ansonsten würde ich Lucidor die beste Desktoptauglichkeit attestieren. Außerdem gibt es noch das Lucidor-Firefox-Plugin, was ich aber noch nicht testen konnte. 

Zuletzt noch ein Lesetip. Wer auf dem Laufenden bleiben will, sollte am besten den Feed von lesen.net abonnieren.

Links:
Verwaltung und Konvertierung: Calibre
Epub-Authoring: Sigil
Lesesoftware: FBReader, EPUBReader, Coolreader, Lucidor

Freitag, 25. März 2011

HTML5 let's start

Die Spielwiese für HTML5 wird allmählich größer und weil ich immer noch gern ausprobiere, habe ich mal ein paar Sachen zusammengesucht.

Für den Start eines HTML5-Projektes ist der HTML5-Templategenerator Initializr hervorragend geeignet. Der Code ist super, um schon mal was zum durchstarten zu haben. Das, was der da generiert, sieht codeseitig durchweg gut aus und könnte so manch einen HTML-Schrauber noch inspirieren.

Im weiteren kann man sich ein wenig auf HTML5 & Friends oder html5rocks umsehen. Beides sind Demo-Seiten, die zeigen wollen, was in HTML5 alles drin steckt. Zuletzt kann man dann auch noch ein bisschen niedriger stapeln und die etwas einfacheren Demos von html5demos durchprobieren.

Der Weg ist eindeutig: Es wird interaktiver und bunter. Dem ist ja bereits so, seit Google mit seinen Mailreader gezeigt hat, wie eine Browseranwendung aussehen kann. Jedenfalls warten eine menge technische Spielereien darauf ausprobiert zu werden.

Bilder im Batch konvertieren und verarbeiten

Heute mal wieder eine Programm, das mir gut gefällt. Der Bildkonverter XnConvert ist zwar nicht OpenSource aber es gibt ihn kostenlos und vor allem für alle gängigen Betriebssysteme - sogar als 64bit-deb, was bei unfreier Software sonst gerne mal fehlt. Die Stärke des Programms liegt ganz klar in der komfortablen Oberfläche, weil Batch-Konvertierung unter Linux ja sonst nicht so spannend ist. Mit der Bash und ImageMagick hat man ja eigentlich schon alles, was man so für die Massenkonvertierung brauchen könnte.
Neben der Formatkonvertierung kann XnConvert aber noch mehr, was es auch erst richtig interessant macht. Es erlaubt nämlich den Einsatz von Filtern, mit denen zum Beispiel Texte eingebettet, EXIF-Daten gelöscht oder Bildmasken aufgesetzt werden können. Die Filterauswahl ist umfangreich und gut handhabbar. Alles in allem macht das Programm einen runden Eindruck.

XnView v1.0
via stadt-bremerhaven

Donnerstag, 24. März 2011

HTML5 von Stefan Münz

Das HTML5-Buch von Stefan Münz und Clemens Gull ist draußen. Das Buch kann vollständig online gelesen werden. Fairer Zug, wie ich finde. Das schafft zudem den Vorteil der Online-Durchsuchbarkeit. Das Buch gibt es auf http://webkompetenz.wikidot.com/docs:html-handbuch

via golem

Mittwoch, 23. März 2011

HTML generieren mit rendersnake

An APIs und Systemen, die HTML auf den Bildschirm bringen, herrscht ja kaum ein Mangel. Ob XSL generiert oder per JSP erzeugt, für beinahe jeden Geschmack ist was dabei. Kürzlich bin ich auf das renderSnake-Projekt aufmerksam geworden. Damit lässt sich HTML mittels Kettenschreibweise (Fluent-Pattern) erzeugen. Ich würde den Einsatz an der Stelle verorten, wo JSP nicht gemocht wird und reine Servlets auch nicht wirklich hübsch anzusehen sind, wenn sie HTML ausgeben sollen. Bestimmt fällt dem einen oder anderen aber noch was besseres ein.

Mit renderSnake sieht das ganze dann zum Beispiel so aus:

public void renderOn(HtmlCanvas html) throws IOException {       
    html
      .div(id("search"))
      .form(
           id("search-form")
           .method("POST")
           .action(this.getClass().getName()))
         .write("Search ")
         .input(name("search-text").type("text"))._input()
      ._form()
      ._div();
    }

Auf jeden Fall eine interessante Lösung, weil zum einen die durchgängige Schreibweise einen gut lesbaren Code erzeugt, zum anderen maximale Flexibilität erhalten bleibt, eben weil man den Java-Code-Scope nie verlässt. Somit stehen auch die gewohnten Refactoring-Tools weiter zur Verfügung, die es zwar auch für JSP gibt, meiner Meinung nach aber an das Eclipse-Refactoring für Java nicht herankommen.

Interessant wäre noch, wie gut das Zusammenspiel mit CSS aussieht bzw. wie man das ausgestalten könnte. Dazu habe ich zumindest nichts vorgegebenes gefunden. Aber man kann ja auch selber noch kreativ werden.

via Dark Views
related java.dzone.com, philemonworks.wordpress.com
project renderSnake

Dienstag, 22. März 2011

Java einfach modernisiert mit Lombok

Es gibt ja einige Dinge, die Java als unmodern angelastet werden, oder die sprachlich schlicht unhandlich sind. Seien es checked Exceptions oder das ewige generieren von Getter- und Setter-Methoden, um nur zwei Themen zu nennen. Für sprachlich frischen Wind kann das Project Lombok sorgen, das eine Hand voll Annotations für genau diese Zwecke bereit stellt. Ein Beispiel: Anstelle zu einem Feld die Getter- und Setter-Methoden zu generieren, deklariert man für das Feld kurzerhand eine @Getter @Setter Annotation. Gleichermaßen lässt sich anstelle vom ewigen hochgereich von checked Exceptions einfach die @SneakyThrows Annotation einsetzen, die den Compiler austrickst, so dass man bei Bedarf auf die Behandlung von checked Exceptions an der Stelle ihres Auftretens verzichten kann. Diese und weitere Features sorgen aufgeräumteren Code, der den Blick aufs Wesentliche schärft. Alles in allem sicher Geschmackssache, aber mir gefällts.

Freitag, 18. März 2011

Entwicklung des Browsermarktes

Sehr hübsch visualisiert. Zwar fehlt der Mosaic, aber ansonsten spiegelt das die Entwicklung im Browsermarkt gut wieder. Man muss es aber auch miterlebt haben, um wirklich etwas damit anfangen zu können. Wie wichtig Netscape damals war und wie der Explorer aufgeholt hat, einfach nur, weil er bereits vorinstalliert war. Ich weiß noch, ein wichtiges Netscape-Feature bestand darin, dass man das Laden der Bilder manuell anstoßen konnte - also erst, wenn man die Seite gesichtet hatte und wusste, dass es sich lohnt darauf zu warten. Das waren noch Zeiten.


via shah3d.com

Donnerstag, 17. März 2011

BerlinExpertDays

Am 7. und 8. April sind die BerlinExpertDays. Ich werde aller Voraussicht nach hingehen. Es gibt auf jeden Fall etliche interessante Themen.