• 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中字段类型相同的字符串加密出来的结果是不一样的,这个需要注意一下。

    4、对中文的加密,这个与Oracle字符集和SQLServer排序规则有关,Oracle的字符集是UTF-8和GBK,通过MD5机密生成的字符串不一样,

      但是不管Oracle是什么编码,加密出来的字符串和SQLServer加密出来的不一样,见下面的测试。

    注:至于为什么Chinese_PRC_CI_AS的排序规则和GBK字符集一致,可以参考 https://www.cnblogs.com/jialanyu/p/11550367.html  这篇文章

    二、操作步骤

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

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

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

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

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

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

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

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

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

    Oracle解密:

     SQLServer解密:

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

    4、查看SQLServer表的字段类型

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

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

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

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

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

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

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

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

    三、Oracle和SQLServer对中文的MD5加密

    1、Oracle字符集是GBK时对 “张三” 的加密

     MD5加密后的字符串:55A33495E8DA99D6A94C8CC9F5B822F6

    2、Oracle字符集是UTF-8时对 “张三” 的加密

      MD5加密后的字符串:689194F497434F866757AE27E1BC240A

    3、SQLServer排序规则是Chinese_PRC_CI_AS时对 “张三” 的加密

     

       MD5加密后的字符串:894152fff4f97e8fb2b8f304c5c56ebb

    4、解密看一下

    (1)Oracle字符集是GBK

    (2)Oracle字符集是UTF-8

     

     (3)SQLServer

     总上所述:Oracle和SQLServer通过MD5加密后的字符串是不能直接对比的,这样不准确,还是要放到同一个环境中,用同一个加密规则来对比数据。

     

     

  • 相关阅读:
    【洛谷4005】小 Y 和地铁(搜索)
    【洛谷4348】[CERC2015] Cow Confinement(扫描线+线段树优化DP)
    【洛谷7016】[CERC2013] Captain Obvious and the Rabbit-Man(手动高斯消元)
    【洛谷3438】[POI2006] ZAB-Frogs(斜率优化)
    【洛谷3426】[POI2005] SZA-Template(KMP)
    【洛谷5157】[USACO18DEC] The Cow Gathering P(拓扑)
    【洛谷5155】[USACO18DEC] Balance Beam P(期望+凸壳)
    【洛谷5204】[USACO19JAN] Train Tracking 2 P(DP)
    【CF757F】Team Rocket Rises Again(最短路图+拓扑)
    【LOJ3038】「JOISC 2019 Day3」穿越时空 Bitaro(线段树)
  • 原文地址:https://www.cnblogs.com/jialanyu/p/13091924.html
Copyright © 2020-2023  润新知