Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Keanggotaan SHA1 hash tidak sama untuk semua pengguna

Hm.. Saya pikir ada sesuatu yang salah ketika dua nilai digabungkan. Hashing harus benar-benar menggunakan array byte, seperti dengan versi enkripsi , tapi sayangnya CF9 hash() fungsi tidak mendukungnya - hanya string. (Meskipun didokumentasikan dengan buruk, ini didukung di CF11). Saya tidak yakin apakah ada solusi CF murni untuk CF9. Namun, sementara itu Anda dapat menggunakan java secara langsung:

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

Pembaruan:

Setelah melihat-lihat lebih jauh, saya tidak berpikir ada solusi CF murni. Pengkodean UTF-16LE hanyalah sebagian dari masalah. Masalah lainnya adalah DNN mendekode setiap string secara terpisah , yang mungkin menghasilkan byte yang berbeda dari saat keduanya didekodekan sebagai tunggal string (lihat perbandingan di bawah). Itu berlaku dalam kasus kata sandi kedua Anda, itulah sebabnya hash terakhir berbeda. Sejak hash tidak akan menerima array byte, saya tidak berpikir itu adalah alat yang tepat untuk pekerjaan ini. MessageDigest adalah cara untuk pergi.

Perbandingan Array Byte

           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 | **
  • lama => charsetDecode(Garam &Kata Sandi, "UTF-16LE")
  • baru => 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 Server PIVOT mungkin?

  2. Cross Join 'n' kali meja

  3. Mengapa dan kapan LEFT JOIN dengan kondisi di klausa WHERE tidak setara dengan LEFT JOIN yang sama di ON?

  4. Cara membuat Batasan Unik pada Beberapa Kolom di SQL Server - Tutorial SQL Server / TSQL Bagian 96

  5. Di SQL Server 2005, bagaimana cara mendapatkan tabel di database lain yang bergantung pada tampilan?