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 | **
- cũ => charsetDecode (theSalt &thePassword, "UTF-16LE")
- mới => ArrayUtils.addAll (saltBytes, passBytes);