Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

SHA1 хешът на членството не е еднакъв за всички потребители

Хм.. Мисля, че нещо може да се обърка, когато двете стойности са свързани. Хеширането наистина трябва да използва байтов масив, както при версията за шифроване , но за съжаление hash() на CF9 функцията не го поддържа - само низове. (Въпреки че е слабо документиран, той се поддържа в CF11). Не съм сигурен дали има чисто CF решение за CF9. Междувременно обаче можете да използвате java директно:

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

Актуализация:

След като се огледах по-нататък, не мисля, че има чисто CF решение. Кодирането UTF-16LE е само част от проблема. Другият проблем е, че DNN декодира всеки низ отделно , което може да произведе различни байтове, отколкото когато и двата се декодират като единичен низ (вижте сравнението по-долу). Така е в случай на втората ви парола, поради което крайният хеш е различен. Тъй като hash няма да приема байтови масиви, не мисля, че е правилният инструмент за тази работа. MessageDigest е правилният път.

Сравнение на байтов масив

           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 | **
  • стар => charsetDecode( theSalt &thePassword, "UTF-16LE")
  • ново => 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. Вмъкване и трансформиране на данни от SQL таблица

  2. Как да получите sql грешка в съхранена процедура

  3. Как да създадете база данни в SQL Server с помощта на TSQL или GUI - SQL Server / TSQL Урок, част 24

  4. Ефективност на условно агрегиране

  5. Голяма сделка:SQL Server 2016 Service Pack 1