2017-05-18 49 views
7

Aşağıdaki değişkenleri almak için bu formülle bir parola özet oluşturmaya çalışıyorum ve kodum eşleşmiyor. Ne yaptığımı bilmiyorum, ama yardıma ihtiyacım olduğunda itiraf edeceğim. Umarım yardım edebilecek biri var. belgelerindenColdFusion Karma

  • Formülü: Base64(SHA1(NONCE + TIMESTAMP + SHA1(PASSWORD)))

  • Doğru Şifre Digest Cevap: +LzcaRc+ndGAcZIXmq/N7xGes+k=

ColdFusion Kodu:

<cfSet PW = "AMADEUS"> 
<cfSet TS = "2015-09-30T14:12:15Z"> 
<cfSet NONCE = "secretnonce10111"> 
<cfDump var="#ToBase64(Hash(NONCE & TS & Hash(PW,'SHA-1'),'SHA-1'))#"> 

Kodum çıkışları:

Njk0MEY3MDc0NUYyOEE1MDMwRURGRkNGNTVGOTcyMUI4OUMxM0U0Qg== 

Açıkçası yanlış bir şey yapıyorum ama hayatımın ne için olduğunu anlayamıyorum. Kimse? Bueller?

+0

Belgelere bir bağlantı gönderebilir misiniz? – Leigh

+0

Döküman genel bir linkte mevcut değil :( –

+0

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

cevap

6

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); 
+0

Çok teşekkür ederim!Bu çok çok yararlı :) –

+1

Bu yardımcı oldu sevindim. (... ve güzel ilk soru. S.O'ya hoşgeldiniz :) – Leigh