有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

如何将此自定义MD5 Java函数转换为JavaScript

我有这个自定义函数来计算MD5散列,是用Java编写的。我不能改变它。我需要将其转换为JavaScript,以便在客户端使用它。我自己尝试过,但无法使用JavaScript数据类型(特别是Javachar[])。。。感谢您的帮助,谢谢

// codes array
char[] codes = new char[64];

// initialise
private void initCodes(){
  codes = new char[64];
  codes[0] = '$';
  int count = 0;
  for (char i='0';i<='9';i++){ count++; codes[count] = i; }
  for (char i='A';i<='Z';i++){ count++; codes[count] = i; }
  for (char i='a';i<='z';i++){ count++; codes[count] = i; }
  codes[63] = '£';
}

// custom MD5 algorithm
public String customMD5(String source) {
  initCodes();
  byte[] buf = new byte[source.length()];
  buf = source.getBytes();
  MessageDigest algorithm = null;
  try {
    algorithm = MessageDigest.getInstance("MD5");
  } catch(NoSuchAlgorithmException e){}
  algorithm.reset();
  algorithm.update(buf);
  byte[] digest = algorithm.digest();
  int len = digest.length;
  char[] encrypted = new char[len];
  for (int i=0;i<len;i++)
    encrypted[i] = codes[(int)(Math.floor((double)((digest[i]+128)/4)))];
  return new String(encrypted);
}

共 (1) 个答案

  1. # 1 楼答案

    请参见此部分:

      MessageDigest algorithm = null;
      try{
         algorithm = MessageDigest.getInstance("MD5");
      }catch(NoSuchAlgorithmException e){}
    

    ??这就是那些东西访问内置在Java运行时中的MD5代码的地方您必须在那里提出自己的MD5实现,这(委婉地说)将是一个棘手的部分

    发布的Java代码真正做的(除了调用运行时进行实际的散列之外)就是通过字符查找表映射结果散列(无论如何,它是散列的一部分)

    编辑-由该Java代码构建的查找表是一个带有“$”、数字、大写字母、小写字母的数组,然后(出乎意料地)是“*”。(最后一个字符令人惊讶,因为它不是旧式的7位ASCII字符代码,但不管怎样。)在JavaScript中,这是:

    var codes = "$0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz£";
    

    然后,Java代码获取哈希算法生成的每个8位字节,并通过向字节中添加128,然后除以4来查找代码字符。Java字节被视为有符号的值,这样就可以将每个字节映射到范围0。。。63.然后将该值用作代码数组的查找

    因此,如果您有一个JavaScript MD5工具,可以返回一个范围为-128的数字数组。。。127(即有符号8位值),您可以通过如下代码数组转换结果:

    var digest = MagicJavaScriptMD5(source);
    var result = [];
    for (var i = 0; i < digest.length; ++i)
      result.push(codes.charAt(~~((digest[i] + 128) / 4)));
    var resultString = result.join('');
    

    由OP编辑: 我冒昧地在这里发布了正确的解决方案,该解决方案高度源自@Pointy的解决方案。它需要md5。来自http://pajhome.org.uk/crypt/md5/的js

    /* MD5 in byte[] format */
    function byteArray_md5(s) {
            var output = [];
            var input = rstr_md5(str2rstr_utf8(s)); //here it uses md5.js
            for(var i = 0; i < input.length; i++)
                    output[i] = input.charCodeAt(i);
            return output;
    }
    /* MD5 with custom mapping.
     * It's a normal MD5 with a final char mapping of the hash.
     */
    function md5WithCustomMapping(source) {
        var codes = "$0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz£";
        var digest = byteArray_md5(source);
    
        var result = [];
        for (var i = 0; i < digest.length; ++i)
            result.push(
                    codes.charAt(
                            ~~( ( digest[i] + 128 * (digest[i]<128 ? 1 : -1) )/4 )
                            )
                        );
        return result.join('');
    }