SHA-512 hashing a byte array in ColdFusion

后端 未结 1 1503
余生分开走
余生分开走 2020-12-12 04:49

I am using ColdFusion 9

Referencing Ben Nadel\'s good works on his blog, I tried

ucase(digestUtils.sha512(imageBinary))

For SHA-51

相关标签:
1条回答
  • 2020-12-12 05:09

    DigestUtils.sha512 was added in version 1.4. ColdFusion 9 uses an older version, 1.3. That is why the method is not found.

    Use the other function based on MessageDigest. Just be sure to pass in the correct algorithm ie:

        imageHash = hashBytes( imageBinary, "SHA-512" );
    

    UPDATE: Based on the updated code, some of the instructions may be a bit misleading. I believe they just mean decode the xml and salt strings from their given encoding (base64 and utf-8) into byte arrays, not strings:

        // note: salt value has invalid characters for base64
        // assuming it is a plain utf-8 string
        saltArray = charsetDecode(salt, "utf-8");
        xmlByteArray = binaryDecode(xmlPost, "base64");
    

    Then merge the two binary arrays (see custom function)

        mergedBytes = mergeArrays( xmlByteArray, saltArray );
    

    Calculate the hash of the new byte array:

        messageDigest = createObject( "java", "java.security.MessageDigest" );
        messageDigest = messageDigest.getInstance( javaCast( "string", "SHA-512") );
        hashedByteArray = messageDigest.digest( javacast("byte[]", mergedBytes) );
    

    Merge the arrays again:

        mergedBytes = mergeArrays( hashedByteArray, saltArray);
    

    Finally convert the binary to base64 and compare:

        calculatedPayload = binaryEncode( javacast("byte[]", mergedBytes), "base64");
    
        // check results
        arePayloadsEqual = compare(calculatedPayload, payload_hash) eq 0;
        WriteDump("arePayloadsEqual="& arePayloadsEqual);
        WriteDump("calculatedPayload="& calculatedPayload);
        WriteDump("payload_hash="& payload_hash);
    

    Note: BinaryDecode/CharsetDecode return java arrays. Unlike CF arrays, they are immutable (ie cannot be changed). So the handy addAll(..) trick will not work here.

        // merge immutable arrays the long way
        function mergeArrays( array1, array2 ){
            var i = 0;
            var newArray = [];
            for (i = 1; i <= arrayLen(arguments.array1); i++) {
                arrayAppend(newArray, arguments.array1[i]);
            }
            for (i = 1; i <= arrayLen(arguments.array2); i++) {
                arrayAppend(newArray, arguments.array2[i]);
            }
            return newArray;
        }   
    
    0 讨论(0)
提交回复
热议问题