在sql server上:输出: 0x5C8C8AAFE7AE37EA4EBDF8BFA01F82B8
SELECT HASHBYTES('MD5', convert(varchar,getdate(),112)+'mytest@+')
在JavaScript上:输出: 5c8c8aafe7ae37ea4ebdf8bfa01f82b8
//to get Md5 Hash bytes
vm.getMd5Hashbytes = function () {
var currentDate = moment().format('YYYYMMDD');
var md5Hash = md5.createHash(currentDate + 'mytest@+');
return md5Hash;
}
问:你能告诉我为什么会有这种不同吗?SQL Server显示0x
为前缀。为什么?
我不知道还有什么其他解释方式,但是它将占用比评论所允许的更多的空间,因此我将其发布为答案。
查看您正在引用的源代码。在最后(第210和212行),您会看到它将二进制值转换为十六进制字符串(然后转换为小写,除非您选择在末尾进行字符串比较,否则这无关紧要)。最终结果=您的JavaScript库使用string
格式为十六进制的类型返回表示形式。
HASHBYTES
另一方面,您的Sql函数会生成varbinary
类型化的结果(该类型与string(varchar)的类型不同)。
因此,您有2种不同的数据类型(每种类型都生活在自己的空间中,因为您还没有拉到另一种)。您永远不会提到要在哪里进行比较,即:在数据库上还是从数据库拉到脚本。两种比较方式都需要转换一种类型,因此您要比较两种字符串类型或比较两种二进制类型。如果不比较相似的类型,将会得到意外的结果或运行时异常。
如果要在JavaScript中使用字符串AND进行比较,则请查看您所引用的库,该库已经有一个名为的调用wordToHex
,将其复制并粘贴并重用以将Sql结果转换为字符串,然后进行字符串比较(忘记比较不区分大小写的字母或将其设为小写)。
WebApi对我来说是黑匣子,它是第三方服务,我只需要如上所述发送安全令牌即可。
假设该Web api接受的类型byt[]
将附加0x
到javascript中的字符串中,然后将其发送到该Web api,如在该Web api中那样工作,然后将传入的参数转换为字节数组,并使用正确的类型执行比较。由于这是一个黑匣子,除非您询问他们接受的类型是否确实是字节数组或对其进行测试,否则无法确定。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句