Heute ist ja ein Arbeitsfreier Tag, perfekt also für eine kleine Anekdote aus dem Programmiereralltag. Letzte Woche war ich mal wieder mit einem Problem konfrontiert, dass mir beinahe die letzten Haare vom Kopf gefegt hätte.
Ich werde versuchen das Problem so uninformatikerisch wie möglich zu beschreiben. Aber ob mir das gelingen wird? Nun es ist so: Damit böse Menschen oder Computer das Passwort einer Person nicht einfach so stehlen können, wird es verschlüsselt. Meistens nur auf dem Server, im Optimalfall aber bereits auf dem Computer des Benutzers bevor es über das Internet an den Server geschickt wird. Für Website-Bauarbeiter ist die Standardtechnologie für eine solche Verschlüsselung Javascript. Und das geht damit auch vooooll einfach. (Weil ich die Verschlüsselungsfunktion irgendwo wegkopiert hatte)
Mein Problem war, dass ich nun eine App gemacht hatte und diese natürlich auch das Passwort vorher verschlüsseln muss. Damit das funktioniert, muss das Passwort GANZ GENAU GLEICH verschlüsselt werden. Am Anfang dachte ich noch, das würde voll easy, da sich die Programmiersprachen relativ ähnlich sind. Ich kopierte einfach die gestohlene Javascript-Funktion und fügte sie ein. Doch das funktionierte nicht, schleuderte Fehler und liess die App abstürzen. Mir wurde klar, dass ich das Schlimmste tun musste, was einen Programmierer erwarten kann: Ich musste verstehen, was die Funktion macht.
Auf den ersten Blick sah das ziemlich trivial aus: Die Funktion nimmt jeden Buchstaben des Passworts und verwandelt ihn in eine Zahl. Der Grossbuchstabe A hat zum Beispiel den Wert 56. Alle Zahlen eines Passworts werden dann zusammengezählt. So würde aus dem wirklich schlechten Passwort AAA dann die Zahl 168 (56+56+56).
Das war doch eigentlich wirklich einfach, oder? Das Problem damit: Die Verschlüsselung wäre so auch viel zu einfach knackbar. Fragt mich nicht wie, ich wäre schon zu dumm dafür. Deshalb wird noch etwas anderes gemacht, womit ich schon Verständnisprobleme hatte. Ein komischer Operator, den ich noch nie gesehen hatte, verschiebt irgendwelche Bits nach links. Dass der das tut, wusste ich natürlich nicht und konnte es auch nicht googeln. Der Operator ist nämlich << und das kann man nicht googeln. Ihr glaubt mir nicht? Probiert es. Irgendwie schaffte ich es aber dann, mich zu erinnern wie man sowas nennt und nach einer Liste von «Javascript Operatoren» zu googeln und eine Website erklärte mir dann dieses Bitzeug. Fies war, dass ich nicht mal hätte verstehen müssen, was es macht: Die App-Programmiersprache macht das nämlich genau gleich #Zeitverschwendung #EtwasNeuesGelernt.
Auf jeden Fall macht diese Funktion jedes Mal die Zahl viel viel viel Grösser. So gross, dass sie «zu gross» wird um gespeichert zu werden. Das war das letzte Problem, welches ich verstehen musste. Und es war mit Abstand das Schwierigste. Die Javascript Funktion, die das Problem löste machte simpel folgendes: |= 0 Und vertraut mir, auch DAS kann man nicht googeln.
Um dieses Problem zu lösen, musste ich Zahlen wie 2281701319 und 73014443975 miteinander vergleichen und herausfinden, wie in aller Welt daraus eine Zahl wie -57 werden kann. Ich verstand natürlich, was das Ziel der Übung war: Eine Zahl erhalten, die weniger als 32 Bits benötigt um gespeichert werden können. Also eine Zahl zwischen -2147483647 und 2147483647. Das ist ja nicht unbedingt die intuitivste Begrenzung. 2’000’000’000 wäre mir lieber gewesen. Auch wird es nicht einfacher, wenn man die Zahlen binär anschaut: 10000111111111111111111111000111. Ich habe mich mehr als einen ganzen Mittag und einen halben Abend damit herumgeschlagen. Irgendwann habe ich bemerkt, dass die Funktion «einfach» alle Bits, die nach dem 32. Bit kamen, abschneidet. Das konnte ich natürlich mega einfach nachstellen:
Indem ich die Zahl in einen Text umwandelte, den Text von rechts nach 32 Zeichen abschnitt und dann wieder in eine Zahl zurückverwandelte. #MegaEinfach #Sarkasmus
Ich war so voller Freude, dass ich es endlich geschafft hatte. Dann probierte ich es mit einem anderen Passwort und es funktionierte wieder nicht. Weitere Investigation zeigte dann, dass es nur in etwa der Hälfte aller Fälle funktionierte. Ich möchte euch nicht noch mehr langweilen … Irgendwann fand ich per Zufall heraus, dass manchmal noch etwas mehr gemacht wird. Es ist mir bis Heute ein Mysterium, wie das genau funktioniert mit diesem |= 0 aber wenigstens habe ich es herausgefunden: Es nimmt die berechnete Zahl und subtrahiert sie von der verdoppelten höchstmöglichen Zahl (2’147’483’647). Mein Kopf ist explodiert.
Inzwischen erscheint mir übrigens alles logisch und ich verstehe auch, was es macht. Das freut nicht nur mich, sondern bestimmt auch meine Firma. Habe ich doch etwas für die Arbeit ausserhalb der Arbeitszeiten gelernt!
Ich könnte übrigens noch einen ganzen Eintrag mit allen Situationen füllen, in denen diese komische Funktion einfach IRGENDWELCHE Zahlen ausgegeben hat, die zwar fast richtig aussahen, aber trotzdem komplett falsch waren.
En schöne Mäntig no,
Pfoffie
Kommentar verfassen