Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Skrót członkostwa SHA1 nie jest taki sam dla wszystkich użytkowników

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Zaktualizować tabelę z losowym rekordem w instrukcji aktualizacji w SQL Server?

  2. Asynchronicznie wykonać procedurę składowaną z formularza systemu Windows, a następnie odłączyć?

  3. Zmień kolumnę w SQL Server

  4. Najskuteczniejszy sposób w SQL Server na pobieranie danych z daty i godziny?

  5. Jak uzyskać wydajną obsługę zakleszczeń Sql Server w C# za pomocą ADO?