generell IT

GIT - Einleitung

Nach über acht Jahren mit Subversion in internen und externen Projekten, hatte ich im letzten Jahr Gelegenheit Erfahrungen mit GIT zu sammeln. Während es auf den ersten Blick wie ein weiteres Sourcecode Verwaltungs-Tool aussieht, merkt man bald, dass es sich doch deutlich unterscheidet. 
Wer sich also mit Perforce, CVS oder Subversion auskennt, tut gut daran Bekanntes erst einmal zu vergessen.

Die Unterschiede sind im Wesentlichen:

GIT speichert nicht eine Liste von Veränderungen auf File-Basis, sondern sieht das verwaltete Verzeichnis (das mit dem .git-Verzeichnis) als Root eines Filesystems. Beim Commit wird ein Snapshot des gesamten Verzeichnisses gespeichert (wobei natürlich unveränderte Files nicht gespeichert werden).

Jeder Entwickler hat das komplette Repository lokal. Das Design von GIT braucht kein zentrales Repository. Die Suche in der History geschieht lokal, was es ungewohnt schnell macht. Ausserdem kann man überall (fast) ohne Einschränkungen am Projekt weiterarbeiten.
Im Firmen-Einsatz ist ein zentrales Repository unablässig, um nightly builds&co durchführen zu können. Hier wird üblicherweise ein stationäres Repository für diesen Zweck angelegt.

Ein Commit ist quasi zweistufig: Der erste Schritt findet lokal mittels commit statt. Der zweite Schritt ist ein push auf ein anderes Repository (z.B. das Zentrale der Firma/des Projekts), das System eines Kollegen oder github. Wobei man dazwischen noch Reihenfolge der lokalen Commits, ... noch ändern kann.
 

Initialer Setup

GIT kann kostenlos von http://git-scm.com/download heruntergeladen und dann installiert werden. Nach der Installation muss einmalig Benutzername und EMail-Adresse definiert werden. Dies wird bei den Commits bzw Pushs verwendet.

git config –global user.name „Vorname Nachname“
git config –global user.email „email@thetop.ch

Mit --system gibt es noch einen höheren Level für diese Konfiguration-Optionen, den man in der Praxis eigentlich nicht verwendet, da er zu weitreichend wirkt.
 

Erste Schritte

Um ein Verzeichnis von GIT verwalten zu lassen, muss im obersten betroffenen Verzeichnis folgendes eingegeben werden:

git init

Dies gilt kaskadierend für sämtliche enthaltenen Verzeichnisse, wobei - anders als bei Subversion - nur auf dem obersten Level ein .git-Verzeichnis angelegt, welches sämtliche GIT-spezifischen Informationen enthält.
Damit GIT die Dateien in den Verzeichnisse verwaltet werden müssen Dateien einzeln, über Wildcards oder verzeichnisweise hinzugefügt werden:

git add read.txt
git add *.java

In folgenden Blog-Einträgen sammle ich meine Erfahrungen zur internen Funktionsweise von GIT.

API Design

Ich möchte hier meine Erfahrungen und Erkenntnisse zum Thema API Design zusammenfassen. Dieses Thema hat soviele Facetten und Stolperfallen, die einem später manchmal sehr teuer zu stehen kommen können. Es ist wichtig, möglichst viel in die Überlegungen beim API-Bau einzubeziehen.

Was verstehe ich unter API?

Ein API ist ein Programmierschnittstelle für die Verwendung einer Komponente von "Aussen". Heute werden Applikationen in Module unterteilt und man definiert üblicherweise APIs bei einem Modul für die Kommunikation mit anderen Modulen. Aber auch innerhalb von Modulen finden sich viele API, die die einzelnen Applikationsteile von einander abtrennen ("teile und herrsche").

Wieso ist es wichtig ein gutes API zu bauen?

Dafür gibt es massenweise Gründe die verschiedene Personenkreise betreffen:

1. Entwickler in anderen Teams verwenden unser API und binden sich damit an unseren Vorschlag ein Problem zu lösen.

2. Entwickler im eigenen Team sind durch das API schlimmstenfalls an gewisse Strukturen und Lösungsansätze gebunden. Weiterentwicklung kann behindert werden, das Schreiben von Testklassen kann schwierig werden und die Innovationszyklen werden länger.

Dies hat natürlich direkten Einfluss auf die Attraktivität der Gesamtlösung. Je schneller und zuverlässiger Anpassungen gemacht werden können, umso besser ist das API.

Was macht ein API zu einem guten API?

Damit ein API gut ist, muss es folgende Kriterien erfüllen:

  1. es ist leicht zu verstehen und zu verwenden
  2. es ist konsistent
  3. es hat einen klar definierten Verwendungszweck
  4. es "zwingt" den Entwickler es richtig zu verwenden
  5. es versteckt Internas
  6. es ist gut dokumentiert

Wie stelle ich sicher, dass das API leicht zu verstehen ist?
Grundsätzlich macht es Sinn, sich wo möglich an APIs von JavaSE zu orientieren. Die kennt Jeder und wenn man sein API so strukturiert, wie es von Java bekannt ist, finden sich Entwickler schneller damit zurecht. Wichtig ist hier die Erkenntnis für wen es einfach zu verstehen sein soll. Kunde eines API ist immer der Entwickler, der mit dem API arbeiten wird. Ich muss mir also überlegen, was will er von diesem Modul, in welchem Kontext bewegt er sich und welche einzelnen Arbeitsschritte sind notwendig.

Da ich nicht immer einen solchen Entwickler zur Hand habe, muss ich mir selbst dessen Hut aufsetzen und den Code schreiben, der notwendig ist, mein API zu verwenden. Dieses Vorgehen führt quasi automatisch zu TDD (test driven design) bzw. BDD (behavior driven design). Ein weiterer wichtiger Aspekt sind die verwendeten Begriffe: wie heissen die Klassen, wie die Methoden und die Parameter? Eine präzise Wahl der Namen kann das API klar und verständlich machen. Wenn es schwierig ist einen Namen für etwas zu finden, dann ist üblicherweise konzeptionell der Wurm drin.

Da alle Klassen, Interfaces und Methoden im JDK englische Namen haben und sich Jeder an diese Namen gewöhnt hat, ist es absolut sinnvoll die eigene API auch komplett auf englisch zu entwickeln und zu benamsen. Wenn man unsicher ist, wie etwas auf englisch heisst, macht es sicher sein einen muttersprachlichen Entwickler zu fragen.

Was macht ein API Konsistenz und wieso ist das wichtig?
Der Programmierer, der mein API verwendet, tut dies um Zeit zu sparen. Er möchte sich auf seine Aufgabe konzentrieren und verwendet deshalb meinen Code, um nicht abgelenkt zu werden. Wenn sich nun mein API an unterschiedlichen Stellen unterschiedlich verhält oder ich verschiedene Namen für die gleichen Dinge verwende, verwirre ich den Kollegen und er wird wahrscheinlich aufgeben mein API zu verwenden.
Also: wichtig ist, dass alle Methoden, die mein API nach aussen zur Verfügung stellt eine ähnliche "Flughöhe" haben und, dass ich gleichen Dingen den gleichen Namen gebe. Ausserdem sollte ich darauf achten, dass ich möglichst wenig Ballast mitbringen, So ist es beispielsweise hinderlich, wenn ich eine lange Liste von Abhängigkeiten (JAR's und/oder AppServer mit spezifischen Versionen) voraussetze, damit mein API funktioniert. Dies schränkt die Einsatzmöglichkeiten deutlich ein.

Wieso ist es wichtig den Verwendungszweck klar zu definieren und daran festzuhalten?
Mit einem klar definierten Funktionsumfang, weiss der Entwickler, was er erwarten kann und was nicht. Es wird immer Wünsche für Erweiterungen und Generalisierungen geben. Diesen nur nachzugeben, wenn es ins Gesamtbild des API passt, ist Aufgabe des API-Leaders. Im Zweifelsfall sollte auf zusätzliche Funktionen verzichtet werden. Funktionen, die sich später als fälschlicherweise hinzugefügt herausstellen, können nicht mehr entfernt werden, weil irgendjemand sie braucht.

Wie zwinge ich den Entwickler mein API richtig zu verwenden?
Diese Frage generell zu beantworten ist kaum möglich. Üblicherweise führt TDD dazu, dass ein API klare Vorgaben über dessen Verwendung macht. Damit dies allerdings gelingt, braucht es viel Disziplin beim Schreiben der Tests. Wenn man beim TDD über Unzulänglichkeiten des APIs stolpert reicht Jammern nicht. TDD kann zu einem kompletten Umbau des API und gegebenenfalls der dahinterliegenden Strukturen führen. Da muss man durch!

Ein wichtiger Aspekt in diesem Zusammenhang ist "den Benutzer des API nicht zu überraschen". Damit meine ich, dass das API das macht, was erwartet wird und dass alle Parameter sinnvoll Initialwerte haben (Convention-over-Configuration).

Wieso soll ich Internas verstecken und wie mache ich das?
Bei den Internas, die versteckt werden sollen, handelt es sich häufig um Datenstrukturen. Beispielsweise wird intern eine HashMap oder eine LinkedList verwendet, um einen Datensammlung zu verwalten. Der Entwickler, der mein API verwendet, soll es nicht wissen. Seine Erwartungen wie die Daten aufgebaut sind, sind wahrscheinlich ganz anders als die bestgeeignetste Struktur, die ich intern verwenden möchte. Und genau das muss das Ziel sein. Es schadet nichts, die Daten von einem Collection-Typ in einen anderen umzukopieren, wenn man dafür die Freiheit hat in einer zukünftigen Version intern alles auf den Kopf zu stellen.

Es sollten keine Klassen, die Serializable implementieren im API verwendet werden, da durch Serializable sämtliche Attribute (auch die privaten) nach aussen weitergegeben werden.

Ein weiteres, klassisches Thema sind Exceptions. Wenn ich hinter meinem API eine SQL-basierte DB verwende, sollte ich dies nicht dem User mitteilen, indem ich ihm SQLExceptions entgegen werfe.

Ausserdem können auch Strings zu Problemen in diesem Zusammenhang führen. Wenn ich in einem String Daten in einem bestimmten Format aufbereite, dann schaffe ich hiermit eine gewisse Abhängigkeit, denn Benutzer meines API werden den String auslesen und parsen. Damit breche ich ihren Code, wenn ich meinen String anders formatiere.

Ein sehr wichtiges Thema in diesem Zusammenhang sind Verantwortlichkeiten. Wenn also mein Modul für die Richtigkeit und Vollständigkeit von gewissen Daten verantwortlich ist, dann gebe ich eine unveränderbare Liste dieser Daten zurück. Am Besten ist es anstatt Klassen Interfaces zu empfangen und zurück zu geben.

Wieso sollte ich eine Dokumentation schreiben?
Nicht alle Funktionalitäten eines API gehen aus dem Interface hervor: Wann werden welche Fehler ausgelöst? Was wird zurückgegeben, wenn keine Daten vorhanden sind (null / leere Liste / Exception)? Der Entwickler, der unser API verwendet, soll solche Dinge direkt aus dem API (bzw. dessen Dokumentation) erfahren. Das macht unser API attraktiv. Ausserdem ist es wichtig, dass gute Verwendungsbeispiele verfügbar sind. Oft werden diese per Copy-Paste von anderen Entwicklern übernommen und auf die eigenen Bedürfnisse angepasst.

JBoss 7 - Was ist neu?

JBoss ist ein sehr weit verbreiteter Application Server, der eigentlich nicht explizit vorgestellt werden muss. Fast jeder hatte irgendwann mal was damit zu tun. (Streng genommen ist JBoss kein Application Server, sondern Name einer Produktfamilie. Genauso wie WebSphere eigentlich kein spezifisches Produkt bezeichnet. Ich werde mir die Struktur der Produktfamilie in einem anderen Blog vornehmen)

Grundsätzlich gibt es die frei verfügbare Version von JBoss und die kostenpflichtige Fassung rund um JBoss EAP (Enterprise Application Plattform). Die freie Version ist EAP quasi immer einen technologischen Schritt voraus. Ein Blick auf JBoss AS 7 zeigt also was in EAP 6 kommen könnte. Da JBoss beim Wechsel auf Version 7 keinen evolutionären sondern einen revolutionären Schritt gemacht hat, möchte ich die wichtigsten Unterschiede hier zusammenfassen.

Es fängt damit an, dass AS7 praktisch komplett neu entwickelt wurde. Die etablierten Bausteine (z.B. Microcontainer) wurden ersetzt und durch eine grundsätzlich andere Architektur ersetzt. Zentraler Unterschied der neuen Architektur ist der modulare Aufbau, dank dem Komponenten erst bei Bedarf gestartet werden. In Profilen kann definiert werden, welche Komponenten anfänglich gestartet werden.

Das Modulsystem nennt sich JBoss Modules und ist ein eigenständiges Projekt, welches auch für andere Projekte eingesetzt werden kann (es geht in die Richtung der für Java 7 versprochenen Modullösung (JSR 294), welche nun bis Ende 2012 als Teil von Java 8 verschoben wurde). Unter Modul wird eine Komponente verstanden, die mit eigenen Ressourcen und Klassen daher kommt und Abhängigkeiten zu anderen Modulen hat. Diese Abhängigkeiten definieren, welche Funktionalitäten von Modul B Modul A sehen kann. Dies entspricht quasi einem 5. Visibility Level in Java, also einer Steigerung von 'public'. Dieser Ansatz löst massenweise Probleme: die Startup-Zeit und der memory footprint wurden massiv verringert. Viel wichtiger ist, dass Module jeweils mit eigenem ClassLoader kommen und die mühseligen ClassPath-Problematiken der Vergangenheit angehören.

JBoss 7 unterstützt Hibernate, Weld, Mojarra und viele weitere opensource Standards. JBoss 7 bietet JavaEE6 Support (Web-Profile; Full Profile folgt in 7.1 später dieses Jahr).

Eine weitere, gut sichtbare Änderung ist das neue GWT-basierte Admin-GUI. Es lässt sich darüber streiten, ob ein solches GUI notwendig war; aber besser aussehen tut's auf jeden Fall ;-)

Neu unterstützt JBoss AS 7 zwei Betriebsmodi: standalone und domain. Stand-alone entspricht ungefähr der bisherigen Betriebsweise. Dabei laufen alle Komponenten (Host Controller und einer oder mehrere managed Application Server auf derselben Maschine). Ein Deployment besteht aus dem Kopieren des WAR-Files nach /standalone/deployments. Dieses Verzeichnis wird vom Deployment Scanner überwacht. Via Filename-Anpassungen wird über den (Miss-)Erfolg von Deployments informiert (neue File-Endung '.deployed' oder '.failed'). Domain unterstützt die Verwaltung mehrerer gemanagte Server (auch auf unterschiedlichen Maschinen). Neben HC und AS kommt bei Domain auch noch ein Domain Controller zum Einsatz, der die einzelnen HCs überwacht. Die einzelnen Application Server werden üblicherweise in Servergruppen zusammengefasst, die betriebliche Funktionen haben (z.B. Test, Integration, Produktion). Diese Servergruppen können mehrere physikalische Server belegen. Applikationen werden in eine Domain geladen und können dann in den verschiedenen Umgebungen deployed werden (Achtung: Konfigurationsdetails wie DB, Log-Settings, ...). Ein Deployment via File copy ist nicht mehr möglich.

Eine weitere spannende Möglichkeit ist die Integration von JBoss in Unit und Integration Tests. Während in vielen Fällen Unit-Tests gar keinen laufenden Application Server mehr benötigen (Stichwort: POJO), gibt es doch noch einige Fälle in denen ein solcher notwendig wäre. Häufig scheitert es daran, dass "professionelle" Application Server nicht sinnvoll in Tests integriert werden können, da sie zu lange zum Starten brauchen, man nicht die entsprechenden Einstellungen mitgeben kann oder eine Integration in einen Testlauf einfach nicht machbar ist. Natürlich gibt es die Möglichkeiten Jetty für gewisse Tests einzubinden, aber der verhält sich wahrscheinlich leicht anders als das System, welches produktiv zum Einsatz kommt. Kurz: man will auf dem Server testen, welcher am Ende des Tages produktiv zum Einsatz kommen wird.

Last but not least, gibt es in JBoss 7 eine Kommandozeile (bin/jboss-admin.sh) für die Administration ohne WebGUI. Mittels Batch-Blöcken lassen sich mehrere Änderungen in einer Transaktion ausführen, um den Server nicht 'unterwegs' in inkonsistente Zustände zu bringen.

Neues in Liferay 6.1

Neue Funktionen von Liferay 6.1

Die folgende Zusammenstellung von neuen Funktionen von Liferay 6.1, ist nicht abschliessend. Ich hab alles was ich finden konnte, zusammengestellt und werde es in Zukunft noch ergänzen.

Internationalisierung

Titel und Beschreibung von Web Content können mehrsprachig sein (endlich!). Ausserdem gibt's ein paar kleine Verbesserungen bei der Usability. Vokabular und Beschreibungen können ebenfalls mehrsprachig sein.

Verbesserung bei SEO

Durch veränderte Strukturen und verbessertes Handling von Schlüsselworten (Mehrsprachigkeit), soll der Google-Support verbessert werden.
Verbesserungen beim Site Management
Editieren von Site und Page Settings als Popup, statt im Kontrollbereich. Damit bleibt der optische Kontext erhalten. Alle Arten von Sites sind nun einfacher zu erstellen und einer Organisation oder Community zuzuordnen

Verbesserungen beim Publishing

Das Staging soll verbessert worden sein. Da müssen noch eigene Tests folgen, denn bisher war Staging eher ungenügend. Ausserdem sollen verschiedene Varianten der Pages gleichzeitig von verschiedenen Teams gebaut werden können. Weitere Funktionen in diesem Zusammenhang: automatisches Versioning, Preview in die Zukunft, Seiten bin über 100'000 Seiten sollen damit verwaltbar sein. Da bin ich ja echt gespannt...

Ausserdem wird das Publizieren von Content einfacher. Es muss nicht mehr ein Asset Publisher erstellt und konfiguriert werden, sondern man kann content-spezifische Viewer direkt einfügen.

Verbesserungen beim Content

Neu lassen sich verschiedene Content-Typen verknüpfen: z.B. Dokumente mit Events oder Events mit Web Content, ...
Verbesserungen bei der Portlet Verwaltung
Portlet Configs können als eigene Applikationen gespeichert und beim Einfügen von Web Content direkt eingebunden werden.

Dokument Library

Dokument Library bekommt einen neuen Look. Sie sieht aufgeräumt und sauber aus.
Es ist neu möglich verschiedene Repositories (Liferay, SharePoint, CMIS, Documentum, Alfresco) gleichzeitig innerhalb eines gemeinsamen GUI geöffnet zu haben. Diese Repositories können bestehend sein (=müssen also nicht speziell für Liferay angelegt werden).
Über die Defintion von eigenen Dokumenttypen, finden Benutzer einfacher ihre Sachen wieder. Es wird möglich sein, hoch geladene Files mit diversen automatischen und manuellen Meta-Informationen zu versehen.
Die Image Gallery wird in die Document Library integriert.

Taxonomie

Das GUI für die Taxonomie wurde verbessert (=schneller und einfacher). Vokabulare können Asset-spezifisch sein und nicht mehr nur global.
Nun sind auch komplexere Kategorisierungen möglich.

Eigene Applikationen

Es soll Möglichkeiten geben, dass Benutzer sich eigene, einfache Applikationen zusammen klicken können. In diesem Zusammenhang soll es Benutzern möglich sein Wizards zu ertsellen. Ob beides dann wirklich funktioniert und realen Anforderungen gerecht wird, möchte ich erstmal sehen. (<- das tönt zu stark nach Marketing und zu wenig nach Realität ;-)

Mobile

Verbesserter Support für Android und iOS-Geräte, inkl. konfigurierbarer Device Erkennung.

OpenSocial 1.1

OpenSocial 1.1 wird integriert. Dazu gehört Kontakt Mangement, ein Twitter-ähnlicher Dienst, ... . Ausserdem wurden verschiedene bestehende Teile überarbeitet: Blogs, Wiki, Kalender, Message Board, Chat, ... .

Development

Auch für Entwickler hat sich einiges getan:
- LifeRay wird SSO Server (SAML2.0, OAuth)
- RESTful Web Services in Ergänzung zu den bestehenden Technologien (basierend auf Atom Publishing Protocol)
- neue Version der Liferay IDE
- verbesserte Dokumentation: javaDoc, Referenz, Entwickler Handbuch (das ist auch überfällig)
- Visual UI builder auf Basis von Alloy UI
- Workflow Designer für Kaleo
- ...
Version 6.1 von Liveray soll im August 2011 kommen. Ob das eine Beta oder ein Release Candidate ist, weiss ich noch nicht.

Passworte

Im Bereich von Passworten gibt es viele Missverständnisse. Heutzutage ist wohl den meisten Leuten bewusst, dass der Name des Partners oder des Haustieres eine sehr schlechte Wahl für ein sicheres Passwort ist. Die übliche Antwort - speziell von uns Techies - sind Passworte wie ?bJn92$!. Solche Passworte sind zwar relativ sicher, aber niemand kann sie sich merken. Das nützt dann auch relativ wenig. Was kann hier getan werden?

Ich möchte systematisch an diese Fragestellung heran gehen und das Feld von hinten aufrollen. Wieso braucht es sichere Passworte? Damit niemand auf unsere privaten Daten wie Mails, Kundenkonten u.ä. zugreifen kann. Bei diesen Daten gibt es grosse Unterschiede: einzelne Bereiche sind besonders schützenswert (Bank, Mail, ...), dafür werden besonders sichere Passworte gebraucht. In anderen Bereichen, wo die Daten weniger missbrauchsgefährdet sind und weniger Schaden entstehen kann, müssen Passworte auch nicht ganz so sicher sein.

Die Sicherheit eines Passworts ergibt sich aus der Zeitdauer, die benötigt wird, es zu knacken. Wie werden Passworte geknackt? Da gibt es hauptsätzlich drei Varianten:

1. Fragen: der einfachste und erschreckenderweise auch sehr häufig erfolgreiche Ansatz ist, einfach die Person nach ihrem Passwort zu fragen. Sehr häufig rücken Personen - ohne sich viel dabei zu überlegen - auf eine direkte Frage mit ihrem Passwort heraus. Drum: NIEMALS sein Passwort jemand anderem mitteilen oder aufschreiben. Auch Passworte per Mail verschicken ist KEINE gute Idee.

2. Lexikon-basierte Suche: wenn die erste Variante nicht möglich ist oder nicht funktioniert hat, nimmt der Angreifer eine Wörterliste zur Hilfe und probiert ob eines der Worte als Passwort verwendet wurde. Drum: niemals nur ein Wort, welches direkt in einem Wörterbuch steht, als Passwort verwenden. In diesem Zusammenhang sind die jährlich veröffentlichten Listen mit den am meisten verwendeten Passworten interessant. Sein eigenes Passwort sollte nicht auf einer dieser Listen stehen, denn diese fliessen natürlich auch in diese Suche ein.

3. Brute Force (=rohe Gewalt): als ultimo ratio testet der Angreifer einfach alle möglichen Buchstaben-Kombinationen durch, bis er den Account geknackt hat. Damit ist zwar grundsätzlich jedes Passwort knackbar, aber das dauert ab einer gewissen Wortlänge viel zu lange. Das macht Passworte, wie ?bJn92$! nicht sicherer als andere Zeichenketten mit acht Zeichen. Grundsätzlich gilt: je länger das Passwort, umso viel länger dauert die Dauer, bis es geknackt ist.

Für die Variante zwei und drei schreibt der Angreifer ein kleines Computerprogramm, welches ihm stundenlanges Tippen abnimmt.

Zuerst ein Blick auf die Variante zwei: Mit einer kurzen Kombination von Worten lässt sich eine sehr hohe Sicherheit erreichen, wenn der Angreifer den Brute Force-Weg wählt. Aber auch bei lexikon-basierter Suche sind die kombinatorischen Varianten riesig:

Bei einer Lexikongrösse von 120'000 Einträgen gibt es bei einem Passwort bestehend aus zwei Worten bereits 14'400'000'000 Kombinationen. Bei einem Passwort bestehend aus drei Worten gibt es bereits 1'728'000'000'000'000 Milliarde Kombinationen.

Bei der Annahme, dass 1000 Anfragen pro Sekunde gemacht werden können (was die wenigsten Webdienste mitmachen, ohne die Verbindung zu kappen) würde es gut 166 Tage dauern, um ein Passwort bestehend aus 2 Worten mit lexikon-basierter Suche zu knacken. Bei drei Worten sind es schon knapp 55'000 Jahre.

Hier ein paar Beispiele zur Variante drei für die Sicherheit von Passworten beim Einsatz des Brute-Force Ansatzes (berechnet mit http://howsecureismypassword.net/):

PasswortBrute Force
Sonne1 Sekunde
Strasse1 Stunde
Passwort2 Tage
?bJn92$!46 Tage
meine Bankca 18 Jahre
tolles Passwort      6 Milliarden Jahre

Was lernen wir daraus? Ein Passwort muss nicht unbedingt möglichst viele Sonderzeichen enthalten und dadurch quasi unbrauchbar werden. Es lassen sich also auch ohne Hieroglyphen Passworte bilden, die nur mit massivem Einsatz von Computern und Zeit geknackt werden können.

Noch besser ist es Worte aus dem Wörterbuch mit Slang- oder Dialektausdrücken zu kombinieren. Dann kann man es sich zwar gut merken, aber die lexikon-basierte Suche wird erfolglos bleiben. Beispiele

PasswortBrute Force
nur en Tescht2 Millionen Jahre
s’bescht Passwort      18 Billionen Jahre

Noch ein wichtiger Punkt: da viele Leute dasselbe Passwort für viele ihrer Accounts verwenden, können mit einem geknackten Passwort diverse Accounts kompromittiert sein.

Es ist mir klar, dass die oben angegebenen Zeitdauern für's Knacken der jeweiligen Passworte abhängig von Art und Menge der verwendeten Rechner sind. Aber ob es 18 Billionen Jahre oder nur 18'000 Jahre dauert mein Passwort zu knacken ist mir ziemlich egal ;-)