Я использую ColdFusion 9SHA-512 хеширование массива байт в ColdFusion
Реферирования добрых дел Бен Надели на his blog, я попытался
ucase(digestUtils.sha512(imageBinary))
Для SHA-512 хеширования Я понимаю, что Страшный:
Метод sha512 не найден. Либо нет методов с указанными типами и типами аргументов , либо методом sha512 является , перегруженным с типами аргументов, которые ColdFusion не может дешифровать достоверно. ColdFusion обнаружил 0 методов, которые соответствуют предоставленным аргументам . Если это объект Java и вы подтвердили, что существует метод , используйте функцию javacast для уменьшения двусмысленности.
Теперь я знаю, что sha512 действительно существует как метод, потому что я видел его here, но когда я выполняю
cfdump var="#digestUtils#"
я только получаю:
md5(byte[]) byte[]
md5(java.lang.String) byte[]
md5Hex(byte[]) java.lang.String
md5Hex(java.lang.String) java.lang.String
sha(java.lang.String) byte[]
sha(byte[]) byte[]
shaHex(java.lang.String) java.lang.String
shaHex(byte[]) java.lang.String
Что случилось с другие методы? Наверное, мне нужно попробовать что-то еще.
Обратите внимание на решение ColdFusion. Решение ColdFusion/Java тоже будет в порядке. Я пытаюсь написать приложение SSO, где сторонние ребята подают мне параметры URL. Я успешно расшифровал 1-й параметр, чтобы получить свой XML-пост. Теперь мне нужно взять 2-й параметр, который является полезной нагрузкой хэша, и пройти через алгоритм, чтобы мой 1-й параметр не был подделан.
========= Редактирование начинается здесь: Хорошо, я попробовал написать код снова безрезультатно.
Алгоритм звучит достаточно просто. Но попытка реализовать это убивает меня.
1. compute the hash string value of the XMLPost string above:
a. convert the base64 salt string to a UTF-8 byte array.
b. convert the base64 XML payload string to a UTF-8 byte array.
c. create a new byte array consisting of the XML payload bytes from step b, appended with the salt bytes from step a.
d. perform a SHA512 hash on the concatenated byte array from step c, which results in a hashed byte array.
e. create a new byte array consisting of the hashed bytes from step d, appended with the salt bytes from step a.
f. convert the result of step e to a base64-encoded string and should be the value of query string parameter "h" payload hash.
xmlPost был создан моими парни третьей стороны, как, например: строки полезной нагрузки Этого XML была преобразована в массив байт UTF-8, который затем был преобразован в строку базы-64. Полученная строка base-64 представляет собой значение моего xmlPost ниже.
Так я это сделать:
<code>
<cfset xmlPost = urlDecode("PD94bWwgdmVyc2lvbj0iMS4wIj8%2bPEVzdG9yZVNzb0N1c3RvbWVyIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPjxDdXN0b21lcklkPjExMjk0MDwvQ3VzdG9tZXJJZD48RGVhbGVyQ29kZT5OODg4ODg8L0RlYWxlckNvZGU%2bPFBvaW50QmFsYW5jZT4yODA8L1BvaW50QmFsYW5jZT48Rmlyc3ROYW1lPkZhaXRoPC9GaXJzdE5hbWU%2bPExhc3ROYW1lPkh1dHVsYTwvTGFzdE5hbWU%2bPC9Fc3RvcmVTc29DdXN0b21lcj4%3d") />
<cfset salt = "[email protected]" />
<cfset payload_hash = urlDecode("EtLDRJfcRESFKpY4OGZZnRSN2THqT%2bEelzOuXVU06jotd2kE4yKnlYay7BqyAdcUSATRgSMaHxZa6uBqKKd9rjNkZmpoNjc0IU11akVyZjk4MzQ0QDA5MA%3d%3d") />
<cfset strXML = ToString(ToBinary(xmlpost)) /> <!--- to get actual XML --->
<!--- base64 encoding returns a byte array --->
<cfset saltByteArray = toBase64(salt, "utf-8") />
<cfset xmlpostByteArray = toBase64(xmlPost, "utf-8") />
<!--- append salt to xmlpost --->
<cfset xmlpostsaltByteArray = xmlpostByteArray & saltByteArray />
<!--- now let us perform a sha512 hash on this concatenated byte array --->
<cfscript>
// Create an instance of our DigestUtils class
digestUtils = createObject("java","org.apache.commons.codec.digest.DigestUtils");
// I hash a byte array using the given algorithm and return a
// 32-character Hexadecimal string. Home-made hash function for CF9 and earlier
function hashBytes(bytes, algorithm = "SHA-512"){
// Get our instance of the digest algorithm that we'll use
// to hash the byte array.
var messageDigest = createObject("java", "java.security.MessageDigest").getInstance(javaCast("string", algorithm));
// Get the digest for the given byte array. This returns the
// digest (i.e., hash) in byte-array format.
var digest = messageDigest.digest(bytes);
// Now that we have our digested byte array (i.e., our hash as another byte
// array), we have to convert that into a HEX string. So, we'll need a HEX buffer.
var hexBuffer = [];
// Each integer in the byte digest needs to be converted into
// a HEX character (with possible leading zero).
for (byte =1 ;byte LTE ArrayLen(digest);byte = byte + 1) {
//for (var byte in digest){
// Get the hex value for this byte. When converting the
// byte, only use the right-most 8 bits (last 8 bits of the integer)
// otherwise the sign of the byte can create oddities
var tail = bitAnd(255, byte);
// Get the hex-encoding of the byte.
var hex = ucase(formatBaseN(tail, 16));
// In order to make sure that all of the HEX characters
// are two-digits, we have to prepend a zero for any
// value that was originally LTE to 16 (the largest value
// that won't result in two HEX characters).
arrayAppend(hexBuffer, (tail <= 16 ? ("0" & hex) : hex));
}
// Return the flattened character buffer.
return(arrayToList(hexBuffer, ""));
}
// Get the hash of the byte array using our hashBytes() function
hashByteArray = hashBytes(xmlpostsaltByteArray);
</cfscript>
<!--- The hashByteArray is in HEX format now. Convert to binary --->
<!--- You must binary decode the hashed string before converting it to binary --->
<cfset hashByteArray = toBase64(BinaryDecode(hashByteArray, 'HEX')) />
<!--- The final step is to append this new hashbytearray with the salt byte array --->
<cfset hashByteArray = hashByteArray & saltByteArray />
<!--- now convert this value to a base64 encoded string --->
<cfset hashByteArray2 = toBase64(hashByteArray)/>
Вот что я получаю за моей strXML переменной:
Actual xml structure converted from base 64 to string:
<?xml version="1.0"?><EstoreSsoCustomer xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><CustomerId>112940</CustomerId><DealerCode>N88888</DealerCode><PointBalance>280</PointBalance><FirstName>Faith</FirstName><LastName>Hutula</LastName></EstoreSsoCustomer>
конечное значение, hasByteArray2 даже отдаленно не похож на payload_hash
Это мой первый раз, когда я делаю это и мое понимание хэширования, байт a rrays и преобразования персонажей вылетели из окна несколько десятилетий назад.
Что я делаю неправильно?
Спасибо Вера Sloan
Я пробовал и пытался и не пытался, чтобы получить значения хэша. См. Отредактированный пост выше. –
Я пока не вижу никаких изменений. Дайте мне знать, когда вы разместите образцы значений. – Leigh
Значения выборки приведены в коде. xmlpost, salt и payload_hash. мой расчетный хеш должен быть таким же, как payload_hash. Но это не так. Я также показал вам, что strXML I декодирован, и он корректен для xmlpost. Моя проблема - хеширование. –