Hm.. Myślę, że coś może pójść nie tak, gdy te dwie wartości zostaną połączone. Hashowanie powinno naprawdę używać tablicy bajtów, jak w wersji zaszyfrowanej , ale niestety hash() funkcja go nie obsługuje - tylko stringi. (Chociaż słabo udokumentowany, jest obsługiwany w CF11). Nie jestem pewien, czy istnieje czyste obejście CF dla CF9. Jednak w międzyczasie możesz używać javy bezpośrednio:
<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>
Aktualizacja:
Po dalszym rozglądaniu się, nie wydaje mi się, żeby było to rozwiązanie w postaci czystego CF. Kodowanie UTF-16LE to tylko część problemu. Innym problemem jest to, że DNN dekoduje każdy ciąg oddzielnie , które mogą dawać inne bajty niż w przypadku, gdy oba są dekodowane jako pojedynczy ciąg (patrz porównanie poniżej). Tak jest w przypadku drugiego hasła, dlatego ostateczny skrót jest inny. Od hash
nie zaakceptuje tablic bajtowych, nie sądzę, że jest to odpowiednie narzędzie do tej pracy. MessageDigest
to droga do zrobienia.
Porównanie tablicy bajtów
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 | **
- stary => charsetDecode(Sól i hasło, "UTF-16LE")
- nowy => ArrayUtils.addAll( saltBytes, passBytes );