2017-05-18 3 views
7

Ich versuche, einen Passwort-Digest mit dieser Formel zu erstellen, um die folgenden Variablen zu erhalten, und mein Code stimmt einfach nicht überein. Ich bin mir nicht sicher, was ich falsch mache, aber ich gebe es zu, wenn ich Hilfe brauche. Hoffentlich ist jemand da draußen, der helfen kann.ColdFusion Hash

  • Formel von Dokumentation: Base64(SHA1(NONCE + TIMESTAMP + SHA1(PASSWORD)))

  • richtige Passwort Digest Antwort: +LzcaRc+ndGAcZIXmq/N7xGes+k=

Coldfusion-Code:

<cfSet PW = "AMADEUS"> 
<cfSet TS = "2015-09-30T14:12:15Z"> 
<cfSet NONCE = "secretnonce10111"> 
<cfDump var="#ToBase64(Hash(NONCE & TS & Hash(PW,'SHA-1'),'SHA-1'))#"> 

Mein Code Ausgänge:

Njk0MEY3MDc0NUYyOEE1MDMwRURGRkNGNTVGOTcyMUI4OUMxM0U0Qg== 

Ich mache eindeutig etwas falsch, aber für das Leben von mir kann nicht herausfinden, was. Jemand? Bueller?

+0

Können Sie einen Link zu der Dokumentation veröffentlichen? – Leigh

+0

Die Dokumentation ist nicht in einem öffentlichen Link verfügbar :( –

+0

Bummer. Irgendwelche "Postable" Beispiele oder Schnipsel - auch in einer anderen Sprache, wie sagen, Java/C# oder PHP? Ich sehe, was das Problem verursacht, und eine Lösung dafür haben Allerdings gibt es eine kleine Unklarheit in ihren Anweisungen, also möchte ich sicherstellen, dass die Lösung in allen Fällen funktioniert. – Leigh

Antwort

6

Der Spaß am Hashing ist, dass selbst wenn Sie mit der richtigen Zeichenfolge (n) beginnen, das Ergebnis immer noch komplett falsch sein kann, wenn diese Zeichenfolgen falsch kombiniert/codiert/decodiert werden.

Das größte Problem ist, dass die meisten dieser Funktionen tatsächlich mit der binären Darstellung der Eingabezeichenfolgen arbeiten. Wie diese Strings decodiert werden, macht einen großen Unterschied. Beachten Sie, dass dieselbe Zeichenkette eine völlig andere Binärdatei erzeugt, wenn sie als UTF-8 gegen Hex dekodiert wird? Das bedeutet, dass die Ergebnisse von Hash, ToBase64 und so weiter völlig anders sein werden.

// Result: UTF-8: 65-65-68-69 
writeOutput("<br>UTF-8: "& arrayToList(charsetDecode("AADE", "UTF-8"), "-")); 

// Result: HEX: -86--34 
writeOutput("<br>HEX: "& arrayToList(binaryDecode("AADE", "HEX"), "-")); 

Mögliche Lösung:

Das Problem mit dem aktuellen Code ist, dass ToBase64 nimmt die Eingabezeichenfolge als UTF-8 codiert wird. Wohingegen Hash() tatsächlich eine hexadezimale Zeichenfolge zurückgibt. ToBase64() dekodiert es also falsch. Verwenden Sie stattdessen binaryDecode und binaryEncode den Hash von Hex base64 zu konvertieren:

resultAsHex = Hash(NONCE & TS & Hash(PW,"SHA-1"), "SHA-1"); 
resultAsBase64 = binaryEncode(binaryDecode(resultAsHex, "HEX"), "base64"); 
writeDump(resultAsBase64); 

robustere Lösung:

Having said that, sehr vorsichtig sein mit String-Verkettung und Hashing. Wie it does not always yield the expected results. Ohne mehr über diese spezifische API zu wissen, kann ich nicht ganz sicher sein, was sie erwartet. In der Regel ist es jedoch sicherer, nur mit den binären Werten zu arbeiten. Leider bietet die ArrayAppend() -Funktion von CF keine Unterstützung für binäre Arrays, aber Sie können problemlos die Klasse verwenden, die mit CF gebündelt ist.

ArrayUtils = createObject("java", "org.apache.commons.lang.ArrayUtils"); 

// Combine binary of NONCE + TS 
nonceBytes = charsetDecode(NONCE, "UTF-8"); 
timeBytes = charsetDecode(TS, "UTF-8"); 
combinedBytes = ArrayUtils.addAll(nonceBytes, timeBytes); 

// Combine with binary of SECRET 
secretBytes = binaryDecode(Hash(PW,"SHA-1"), "HEX"); 
combinedBytes = ArrayUtils.addAll(combinedBytes, secretBytes); 

// Finally, HASH the binary and convert to base64 
resultAsHex = hash(combinedBytes, "SHA-1"); 
resultAsBase64 = binaryEncode(binaryDecode(resultAsHex, "hex"), "base64"); 

writeDump(resultAsBase64); 
+0

Vielen Dank!Das ist so sehr hilfreich :) –

+1

Froh, dass es geholfen hat. (... und nette erste Frage. Willkommen in S.O. :) – Leigh