让angular-md5.js支持UTF8

出于安全,近来的项目要求对传递给后端的参数数据添加签名,后端Java用的是MD5解密,要求也相应地使用MD5加密。很自然会git到angular-md5.js(https://github.com/gdi2290/angular-md5)这个工具包。使用很简单,用服务作为参数注入调用md5.createHash方法进行MD5加密。作者甚至还提供了两个过滤器方便大家使用。

不过在和后端调时我发现这个方法不支持中文。看后端,为支持中文用的是UTF8解码,那相应的前端也应该使用UTF8编码。对照jQuery-md5.js(https://github.com/placemarker/jQuery-MD5)仔细看了一下angular-md5.js的源码,原来确实没有做UTF8编码。如何让angular-md5.js支持UTF8参照jQuery-md5.js?其实不难,只要添加uTF8Encode方法,并在convertToWordArray返回值前调用就行了。如下代码片段:

var uTF8Encode = function(string) {
  string = string.replace(/\x0d\x0a/g, "\x0a");
  var output = "";
  for (var n = 0; n < string.length; n++) {
    var c = string.charCodeAt(n);
    if (c < 128) {
      output += String.fromCharCode(c);
    } else if ((c > 127) && (c < 2048)) {
      output += String.fromCharCode((c >> 6) | 192);
      output += String.fromCharCode((c & 63) | 128);
    } else {
      output += String.fromCharCode((c >> 12) | 224);
      output += String.fromCharCode(((c >> 6) & 63) | 128);
      output += String.fromCharCode((c & 63) | 128);
    }
  }
  return output;
};

var x = [], k, AA, BB, CC, DD, a, b, c, d, S11 = 7, S12 = 12, S13 = 17, 
  S14 = 22, S21 = 5, S22 = 9, S23 = 14, S24 = 20, S31 = 4, S32 = 11, 
  S33 = 16, S34 = 23, S41 = 6, S42 = 10, S43 = 15, S44 = 21;
x = convertToWordArray(uTF8Encode(str));

发表评论