sql >> Database >  >> RDS >> Sqlserver

Lidmaatschap SHA1 hash niet voor alle gebruikers hetzelfde

Hm.. Ik denk dat er iets mis kan gaan als de twee waarden aaneengeschakeld worden. De hashing zou echt een byte-array moeten gebruiken, zoals bij de versleutelde versie , maar helaas is de hash() van CF9 functie ondersteunt het niet - alleen strings. (Hoewel slecht gedocumenteerd, wordt het ondersteund in CF11). Ik weet niet zeker of er een pure CF-oplossing is voor CF9. In de tussentijd kunt u Java echter rechtstreeks gebruiken:

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

Bijwerken:

Na verder rondgekeken te hebben, denk ik niet dat er een pure CF-oplossing is. De UTF-16LE-codering is slechts een deel van het probleem. Het andere probleem is dat DNN elke string afzonderlijk decodeert , die andere bytes kan produceren dan wanneer beide worden gedecodeerd als een enkele tekenreeks (zie vergelijking hieronder). In het geval van uw tweede wachtwoord wel, daarom is de laatste hash anders. Sinds hash accepteert geen byte-arrays, ik denk niet dat dit de juiste tool is voor deze taak. MessageDigest is de juiste keuze.

Byte-array-vergelijking

           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 | **
  • oud => charsetDecode( theSalt &thePassword, "UTF-16LE")
  • nieuw => ArrayUtils.addAll( saltBytes, passBytes);



  1. De beste manier om periodiek Oracle-query's uit te voeren

  2. WorkbenchJ - Fout:aggregaten niet toegestaan ​​in GROUP BY-clausule

  3. Hoe LOWER() werkt in MariaDB

  4. SSMS 2008 converteert controletekens naar spaties bij gebruik van 'Resultaten naar raster'