Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Thành viên SHA1 băm không giống nhau cho tất cả người dùng

Hm .. Tôi nghĩ có thể xảy ra sự cố khi hai giá trị được nối với nhau. Hàm băm thực sự nên sử dụng mảng byte, giống như với phiên bản mã hóa , nhưng rất tiếc, băm () của CF9 hàm không hỗ trợ nó - chỉ chuỗi. (Mặc dù được ghi chép kém, nó được hỗ trợ trong CF11). Tôi không chắc liệu có một CF thuần túy hoạt động cho CF9 hay không. Tuy nhiên, trong thời gian ngắn bạn có thể sử dụng java trực tiếp:

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

Cập nhật:

Sau khi nhìn xa hơn, tôi không nghĩ rằng có giải pháp CF thuần túy. Mã hóa UTF-16LE chỉ là một phần của vấn đề. Vấn đề khác là DNN giải mã từng chuỗi riêng lẻ , có thể tạo ra các byte khác với khi cả hai được giải mã dưới dạng đơn lẻ chuỗi (xem so sánh bên dưới). Nó xảy ra trong trường hợp mật khẩu thứ hai của bạn, đó là lý do tại sao hàm băm cuối cùng lại khác. Kể từ khi hash sẽ không chấp nhận mảng byte, tôi không nghĩ rằng nó là công cụ phù hợp cho công việc này. MessageDigest là con đường để đi.

So sánh mảng 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 | **
  • => charsetDecode (theSalt &thePassword, "UTF-16LE")
  • mới => 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. Lợi ích của việc có trường varbinary trong một bảng 1-1 riêng biệt là gì?

  2. DATALENGTH () trong SQL Server là gì?

  3. Hiệu suất cơ sở dữ liệu chéo SQl 2008 trên cùng một máy vật lý và cùng một phiên bản máy chủ

  4. Chỉ định tên cột làm tham số trong câu lệnh SELECT?

  5. Làm cách nào để ngăn trình kích hoạt cơ sở dữ liệu tái diễn?