oracle md5 重复,33-SQLServer和Oracle使用MD5加密字符串不一致的问题

一、总结

1、varchar: 可变长度的非Unicode字符数据.n的值必须在1到8000之间.n是2的话,表示2个字节,所以可以存储2个英文,只能存储1个中文。

nvarchar: 可变长度的Unicode字符数据.n的值必须在1到4000之间.意思就是不管是英文还是中文都按照2个字节来处理。

2、Unicode和非Unicode的区别

Unicode字符集就是为了解决中文而产生的,英文存储一个英文只需要1个字节,但是中文的存储一个汉字需要2个字节。

3、nvarchar类型的字段使用MD5加密后的结果是md5(unicode)类型,

varchar类型的字段使用MD5加密后的结果是md5类型,

所以2中字段类型相同的字符串加密出来的结果是不一样的,这个需要注意一下。

二、操作步骤

1、使用Oracle加密‘jack’字符串

命令:select utl_raw.cast_to_raw(DBMS_OBFUSCATION_TOOLKIT.MD5(INPUT_STRING =>‘jack‘)) from dual;

bede939b483a591d6a6b1e30d87ea23e.png

Oracle对 ‘jack’ 加密后的字符串为:4FF9FC6E4E5D5F590C4F2134A8CC96D1

2、使用SQLServer加密‘jack’字符串

命令:select name ,substring(sys.fn_sqlvarbasetostr(HashBytes(‘MD5‘,name)),3,32) from customer..person  where id=9

21153d38a4a0858602cd9eae378ac660.png

SQLServer对 ‘jack’ 加密后的字符串为:fdd311ede98f57ad459c86c08c63f8f4

注:从上面加密后的结果看,SQLServer和Oracle使用MD5对 ‘jack’ 加密后的结果不一致

3、使用网上对MD5加密后的字符串解密看一下

这里提供一个在线解密的网址:https://www.somd5.com/(这个大家可以在网上找,挺多的)

Oracle解密:

f55bf972bab0b6207784bea3ae09d17d.png

SQLServer解密:

b81becadb0c6f925c8f30e97299bbd91.png

注:发现解密后的结果都是 ‘jack’,仔细看可以发现,Oracle的加密类型是md5,SQLServer的加密类型是md5(unicode),突然想到了SQLServer里表的字段类型,赶紧查看

4、查看SQLServer表的字段类型

fd0794aaed46c13ccdffef139a438de7.png

注:发现name的字段类型是nvarchar的,也就是Unicode字符类型的(上面有做详细解释),所以加密后是md5(unicode)的,问题似乎找到了,赶紧创建一个varchar的测试一下

5、SQLServer里测试字段类型是varchar的加密结果

(1)创建一张per表,name的字段类型是varchar

8f8cce20f8f968bc6c8075652b227bc3.png

(2)对这张表name是‘jack’的数据加密

b2592eea6b49f75f8de13c1e14fe4fed.png

这次加密后是:4ff9fc6e4e5d5f590c4f2134a8cc96d1,发现和Oracle一致了。

6、SQLServer直接对nvarchar字段类型的表装换类型加密看一下结果

命令:select substring(sys.fn_sqlvarbasetostr(HashBytes(‘MD5‘,convert(varchar(20),name))),3,32) from customer..person  where id=9

811b5cd30324607bf2809a33b3057676.png

注:发现也是一致的,所以可以直接对nvarchar类型的字段转换类型来加密,解决加密不一致的问题。

最终问题解决,就是字段类型的问题!!!

原文:https://www.cnblogs.com/jialanyu/p/13091924.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值