Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Le hachage SHA1 de l'adhésion n'est pas le même pour tous les utilisateurs

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 );