SHA1 und ColdFusion 6.1

Marco Betschart, Webapplikations-Programmierer, bis 2010

Der SHA1-Algorithmus kann bei älteren ColdFusion Versionen nicht direkt verwendet werden um einen Hash-String zu erzeugen. Deshalb verwendete ich bis anhin die SHA1-Implementierung von Rob Brooks-Bilson von CFlib.org. Diese Implementierung basiert auf dem CustomTag Code von Tim McCarthy. Heute bin ich über einen bemerkenswerten Fehler in dieser Implementierung gestolpert: Lustigerweise wird bei einer Message-Länge von 55 Zeichen ein falscher Hash-String generiert.

Der folgende Code

1<cfset str = "ABCDE1234567890abcdefghijklmnopqrstuvwxyz0987654321WXYZ" />
2<cfoutput>#sha1(str)#</cfoutput>

erzeugt diese Ausgabe:

19C10E5A45AC5BEF4D0810E308CAE4514256A8521

Nutzt man unter ColdFusion 9 die hash-Funktion, so erscheint ein anderer Hashwert. Da erzeugt der Code

1<cfset str = "ABCDE1234567890abcdefghijklmnopqrstuvwxyz0987654321WXYZ" />
2<cfoutput>#hash(str,"SHA")#</cfoutput>

auf magische (aber korrekte) Art und Weise die folgende Ausgabe:

1132D865A5630AAEE0BCFAA039B60A446DB675404

Unglücklicherweise kann bei zu alten ColdFusion-Versionen nicht auf die hash-Funktion zurückgegriffen werden. Der optionale Parameter für den Algorithmus wurde erst in der Version 7 hinzugefügt. Für ColdFusion ab Version 6 schafft zumindest Railo abhilfe.

Von dort kann die korrekt arbeitende Java Klasse railo.runtime.crypt.SHA1 extrahiert und als Hotfix eingebunden werden. Innerhalb von ColdFusion kann dann ganz einfach auf die Java-Klasse zurückgegriffen werden:

1<cfset str = "ABCDE1234567890abcdefghijklmnopqrstuvwxyz0987654321WXYZ" />
2<cfset jSHA1 = createObject("java","railo.runtime.crypt.SHA1") />
3<cfset jSHA1.update(javaCast("string",str)) />
4<cfset jSHA1.finalize() />
5<cfoutput>#uCase(jSHA1.toString())#</cfoutput>