Biçimlendirmeyle ilgili eğlenceli olan şey, doğru dizelerle başlasanız bile, sonuç dizinin yanlış bir şekilde birleştirilmesi/kodlanması/çözülmesi durumunda sonuç tamamen yanlış olabilir.
En büyük yakalama, bu işlevlerin çoğunun aslında giriş dizelerinin ikili gösterimi ile çalışmasıdır. O zaman bu dizelerin nasıl çözüldüğü büyük bir fark yaratır. Aynı dize, Hex'e karşı UTF-8 kodu çözüldüğünde tamamen farklı ikili üretiyor mu? Bu Hash, ToBase64, etcetera sonuçlarının da tamamen farklı olacağı anlamına gelir.
// Result: UTF-8: 65-65-68-69
writeOutput("<br>UTF-8: "& arrayToList(charsetDecode("AADE", "UTF-8"), "-"));
// Result: HEX: -86--34
writeOutput("<br>HEX: "& arrayToList(binaryDecode("AADE", "HEX"), "-"));
Olası Çözüm: Geçerli koduyla
sorun ToBase64 girdi dizesi UTF-8 olarak kodlanmış varsayar olmasıdır. Oysa Hash() aslında onaltılı bir dize döndürür. Yani ToBase64() yanlış çözer. Bunun yerine, onaltılık base64 için karma dönüştürmek binaryDecode ve binaryEncode kullanın:
resultAsHex = Hash(NONCE & TS & Hash(PW,"SHA-1"), "SHA-1");
resultAsBase64 = binaryEncode(binaryDecode(resultAsHex, "HEX"), "base64");
writeDump(resultAsBase64);
Daha Sağlam Çözüm:
dizisi birleştirme ve Karma işlemi çok dikkatli olun, Having. it does not always yield the expected results. Bu özel API hakkında daha fazla şey bilmeden, ne beklediğinden tamamen emin olamam. Ancak, sadece ikili değerler ile çalışmak genellikle daha güvenlidir. Ne yazık ki, CF'nin ArrayAppend() işlevi ikili dizileri desteklemiyor, ancak CF ile birlikte verilen Apache's ArrayUtils sınıfını kolayca kullanabilirsiniz.
ArrayUtils = createObject("java", "org.apache.commons.lang.ArrayUtils");
// Combine binary of NONCE + TS
nonceBytes = charsetDecode(NONCE, "UTF-8");
timeBytes = charsetDecode(TS, "UTF-8");
combinedBytes = ArrayUtils.addAll(nonceBytes, timeBytes);
// Combine with binary of SECRET
secretBytes = binaryDecode(Hash(PW,"SHA-1"), "HEX");
combinedBytes = ArrayUtils.addAll(combinedBytes, secretBytes);
// Finally, HASH the binary and convert to base64
resultAsHex = hash(combinedBytes, "SHA-1");
resultAsBase64 = binaryEncode(binaryDecode(resultAsHex, "hex"), "base64");
writeDump(resultAsBase64);
Belgelere bir bağlantı gönderebilir misiniz? – Leigh
Döküman genel bir linkte mevcut değil :( –
Bummer Herhangi bir "postable" örnek veya parçacık - hatta başka bir dilde, örneğin java/C# veya php gibi? Soruna neden olduğunu görüyorum ve bunun için bir çözüm var Bununla birlikte, özel bir durum var, ancak bu durumda, bazı durumlarda, çözümün her durumda çalıştığından emin olmak istiyorum. – Leigh