Hm.. Jag tror att något kan gå fel när de två värdena är sammanlänkade. Hashing bör verkligen använda en byte-array, som med den krypterade versionen , men tyvärr CF9:s hash(7c52) funktion stöder det inte - bara strängar. (Även om det är dåligt dokumenterat stöds det i CF11). Jag är inte säker på om det finns en ren CF-lösning för CF9. Men under tiden kan du använda java direkt:
<cfscript>
thePassword = "[email protected]";
base64Salt = "+muo6gAmjvvyy5doTdjyaA==";
// extract bytes of the salt and password
saltBytes = binaryDecode(base64Salt, "base64");
passBytes = charsetDecode(thePassword, "UTF-16LE" );
// next combine the bytes. note, the returned arrays are immutable,
// so we cannot use the standard CF tricks to merge them
ArrayUtils = createObject("java", "org.apache.commons.lang.ArrayUtils");
dataBytes = ArrayUtils.addAll( saltBytes, passBytes );
// hash binary using java
MessageDigest = createObject("java", "java.security.MessageDigest").getInstance("SHA-1");
MessageDigest.update(dataBytes);
theBase64Hash = binaryEncode(MessageDigest.digest(), "base64");
WriteOutput("<br />theBase64Hash= "& theBase64Hash &"<br/>");
WriteOutput("DBPassword= nfcqQBgeAm0Dp1oGZI0O70Y6DvA= <br />");
</cfscript>
Uppdatering:
Efter att ha tittat runt vidare så tror jag inte att det finns en ren CF-lösning. UTF-16LE-kodningen är bara en del av problemet. Det andra problemet är att DNN avkodar varje sträng separat , som kan producera andra byte än när båda är avkodade som en singel sträng (se jämförelse nedan). Det gör det när det gäller ditt andra lösenord, varför den slutliga hashen är annorlunda. Sedan hash
kommer inte att acceptera byte-arrayer, jag tror inte att det är rätt verktyg för det här jobbet. MessageDigest
är vägen att gå.
Byte Array Comparison
old| new |
1 | -6 | -6 |
2 | 107 | 107 |
3 | -88 | -88 |
4 | -22 | -22 |
5 | 0 | 0 |
6 | 38 | 38 |
7 | -114 | -114 |
8 | -5 | -5 |
9 | -14 | -14 |
10 | -53 | -53 |
11 | -105 | -105 |
12 | 104 | 104 |
13 | -3 | 77 | **
14 | -1 | -40 | **
15 | 68 | -14 | **
16 | 0 | 104 | **
17 | 84 | 68 | **
18 | 0 | 0 |
19 | 33 | 84 | **
20 | 0 | 0 |
21 | 64 | 33 | **
22 | 0 | 0 |
23 | 49 | 64 | **
24 | 0 | 0 |
25 | 50 | 49 | **
26 | 0 | 0 |
27 | | 50 | **
28 | | 0 | **
- gammal => charsetDecode( theSalt &thePassword, "UTF-16LE")
- ny => ArrayUtils.addAll( saltBytes, passBytes );