我试图在Coldfusion中复制一个返回字符串的函数。该函数如下所示:
<cffunction name="createKey" access="public" output="false" returntype="string" hint="Creates a propper ecryption/decryption key from a string.">
<cfargument name="thePassword" type="string" required="yes">
<cfargument name="algorithmType" type="string" required="no" default="MD5">
<cfargument name="binaryEncodeType" type="string" required="no" default="Hex">
<cfset var theKey = Hash(ARGUMENTS.thePassword,ARGUMENTS.algorithmType)>
<cfset theKey = ToBase64(BinaryDecode(theKey, ARGUMENTS.binaryEncodeType))>
<cfreturn theKey>
</cffunction>
返回的字符串是一个键值,所以我必须从新的.Net函数中获得相同的匹配值。
此行的.net等效工作正常:
<cfset var theKey = Hash(ARGUMENTS.thePassword,ARGUMENTS.algorithmType)>
复制这一点,但是:
<cfset theKey = ToBase64(BinaryDecode(theKey, ARGUMENTS.binaryEncodeType))>
证明是困难的。我得到它解码哈希并将其转换为Base64,但CF中的BinaryDecode函数采用&#34; Hex&#34;作为解码类型。我有什么想法可以在.NET中执行此操作并获得与我在Coldfusion中获得的字符串值相同的字符串值吗?
答案 0 :(得分:1)
第二个想法,这可能是最好不进行精确翻译的情况。如果您只需要计算普通字符串的哈希值,那么跳过转换为十六进制并直接使用二进制文件。生成的base64字符串将与之前相同,并且将匹配CF的结果。
<强> C#:强>
string thePlainTextPassword = "some password";
SHA256CryptoServiceProvider sha256 = new SHA256CryptoServiceProvider();
byte[] data = Encoding.UTF8.GetBytes(thePlainTextPassword);
byte[] hash = sha256.ComputeHash(data);
string key = Convert.ToBase64String(hash);
CF代码:
key = createKey(thePlainTextPassword , "SHA-256", "hex");
<强>结果:强>
5i4SaTF7llThMU3+y3jymzWtTTYtoKnCzNtoCqU11+o=
虽然回答原始问题,但如果你真的需要一个字面翻译,你可以使用类似于the suggestion in this answer的东西将十六进制字符串转换为字节数组:
public static byte[] StringToByteArray(string hex) { return Enumerable.Range(0, hex.Length) .Where(x => x % 2 == 0) .Select(x => Convert.ToByte(hex.Substring(x, 2), 16)) .ToArray(); }
然后将字节编码为base64:
string hex = "E62E1269317B9654E1314DFECB78F29B35AD4D362DA0A9C2CCDB680AA535D7EA";
string key = Convert.ToBase64String(StringToByteArray(hex));
<强>结果:强>
5i4SaTF7llThMU3+y3jymzWtTTYtoKnCzNtoCqU11+o=