Hm .. Je pense que quelque chose ne va pas lorsque les deux valeurs sont concaténées. Le hachage devrait vraiment utiliser un tableau d'octets, comme avec la version cryptée , mais malheureusement le hash() de CF9 la fonction ne le prend pas en charge - uniquement des chaînes. (Bien que mal documenté, il est pris en charge dans CF11). Je ne sais pas s'il existe une solution de contournement purement CF pour CF9. Cependant, en attendant, vous pouvez utiliser java directement :
<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>
Mise à jour :
Après avoir regardé plus loin, je ne pense pas qu'il existe une solution CF pure. L'encodage UTF-16LE n'est qu'une partie du problème. L'autre problème est que DNN décode chaque chaîne séparément , qui peut produire des octets différents que lorsque les deux sont décodés comme un simple string (voir comparaison ci-dessous). C'est le cas dans le cas de votre deuxième mot de passe, c'est pourquoi le hachage final est différent. Depuis hash
n'acceptera pas les tableaux d'octets, je ne pense pas que ce soit le bon outil pour ce travail. MessageDigest
est la voie à suivre.
Comparaison des tableaux d'octets
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 | **
- ancien => charsetDecode( theSalt &thePassword, "UTF-16LE")
- nouveau => ArrayUtils.addAll( saltBytes, passBytes );