写在前面:
MD5和Base64的函数实现并不是本文的重点,重点是在实现过程中遇到的字符集转换的麻烦
最近由于工作需要,要将BIEE与公司现有的ERP系统做集成,使用外部表的方式。
现有系统基于.Net平台,数据库为SQL Server 2008 R2,用户密码采用先算MD5在转Base64的方式存于数据库中。
代码逻辑如下
byte[] byteString = null;
MD5 md5 = MD5.Create();
byteString = md5.ComputeHash(Encoding.Unicode.GetBytes(Str));
md5.Clear();
string NewStr = Convert.ToBase64String(byteString);
Encoding.Unicode.GetBytes(Str)这句为最关键的部分,其作用是把Str转换成了Unicode字节数组,正是这里给整个工作带来了困难!因为本人不懂C#,所以不知道C#里的Unicode是使用的UTF16LE(小头),而非常见的UTF16BE(大头)。SQL Server 里的Nvachr应该也是采用的是UTF16LE,而Oracle里的NVarchar2则是采用的UTF16BE,正是因为这点导致MD5出来的值串不一致!
对于qaz123三者的输出值分别为:
Oracle:
SQL> select utl_raw.cast_to_varchar2(utl_encode.base64_encode(GET_MD5('qaz123'))) from dual;
UTL_RAW.CAST_TO_VARCHAR2(UTL_E
------------------------------------------------