【发布时间】:2011-04-10 15:02:11
【问题描述】:
我试图弄清楚如何在 SQL Server 和 ColdFusion 之间生成匹配的 MD 5 哈希值。根本原因似乎是 SQL Server 字段是 nvarchar 数据类型,这似乎意味着我需要对我将在 ColdFusion 或 Java 中散列的字符串进行编码以使其匹配,但我无法想办法。要清楚这是否是 SQL Server varchar 字段,一切正常。
这是我正在尝试的代码:
<cfset stringToHash = "Hello world!">
<cfquery name="sqlserver" datasource="#mySqlServerDSN#">
SELECT RIGHT(
master.dbo.fn_varbintohexstr(
HashBytes(
'MD5',
CAST(<cfqueryparam value="#stringToHash#" cfsqltype="cf_sql_varchar"> AS nvarchar(max))
)
)
, 32) AS HASHED
</cfquery>
<cfoutput>
<pre>
CF UFT-8: #hash(stringToHash, 'MD5', 'UTF-8')#
CF UFT-16: #hash(stringToHash, 'MD5', 'UTF-16')#
SQL Server: #sqlserver.hashed#
</pre>
</cfoutput>
生产
CF UTF-8: 86FB269D190D2C85F6E0468CECA42A20
CF UTF-16: 0C89A9720D83539E3723BB99C07D069F
SQL Server: f9a6119c6ec37ce652960382f8b59f2c
所以我猜我需要将传递给hash() 的最后一个参数更改为不同的编码,但我无法弄清楚。我也将此问题标记为 Java,因为我也很乐意用该语言回答。
【问题讨论】:
-
看起来其他人在使用 .Net stackoverflow.com/questions/5341556/… 时遇到了这个问题,我没有办法测试它,但也许 CF UTF-16 编码默认是 Big Endian?
-
如果要将纯字符串值与 SQL hased 列进行比较,请将纯字符串传递给 SQL 并使用 SQL 散列。然后与该列进行比较。在 CF 代码中检查是否有任何具体要求?
标签: java sql-server coldfusion