sql >> Databasteknik >  >> RDS >> Sqlserver

Medlemskap SHA1 hash inte samma för alla användare

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



  1. Syntaxfel på grund av att ett reserverat ord används som tabell- eller kolumnnamn i MySQL

  2. Bästa sättet att hantera felstavningar i en MySQL-fulltextsökning

  3. Uncaught Error:Anrop till en medlemsfunktion prepare() på null-fel

  4. Att ha utländsk nyckel-begränsning när rader raderas med hjälp av inre join