代码之家  ›  专栏  ›  技术社区  ›  snikitin-de

C#和Java中的SHA512不同

  •  2
  • snikitin-de  · 技术社区  · 7 年前

    C#和java上都有这样的代码,其中的sha512不同,是否可能以某种方式使结果sha512相同?我理解BaseConverter中的问题,Java中的模拟Base64?尝试

    Base64.getEncoder().encodeToString(str);
    

    但是由于getEncoder(),我得到了一个错误。我需要图书馆吗?

    C#代码:

    public string Hash(string str)
    {
          string resultStr = String.Empty;
          byte[] data = new UTF8Encoding().GetBytes(str);
          byte[] result;
    
          SHA512 shaM = new SHA512Managed();
          result = shaM.ComputeHash(data);
          resultStr = ReverseString(BitConverter.ToString(result).ToLower().Replace("-", String.Empty));
    
          return resultStr.Substring(5, 25);
    }       
    
    public static string ReverseString(string s)
    {
          char[] charArray = s.ToCharArray();
          Array.Reverse(charArray);
          return new string(charArray);
    }
    

    Java代码:

    public String Hash(String str) {
        try {
            MessageDigest digest = MessageDigest.getInstance("SHA-512");
            digest.update(str.getBytes("UTF-16LE"));
            byte messageDigest[] = digest.digest();
            StringBuffer hexString = new StringBuffer();
            for (int i = 0; i < messageDigest.length; i++) {
                String h = Integer.toHexString(0xFF & messageDigest[i]);
                while (h.length() < 2)
                    h = "0" + h;
                hexString.append(h);
            }
            result = hexString.toString().toLowerCase();
    
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
    
        return ReverseString(result).substring(5, 25);
    }
    
     public static String ReverseString(String s)
        {
            return new StringBuilder(s).reverse().toString();
        }
    
    2 回复  |  直到 7 年前
        1
  •  7
  •   Jon Skeet    7 年前

    digest.update(str.getBytes("UTF-16LE"));
    

    byte[] data = new UTF8Encoding().GetBytes(str);
    

    (我不知道你为什么要创建一个新的 UTF8Encoding 而不是使用 Encoding.UTF8 无可否认。)

    通过不同的输入 获取不同的哈希。

    • 消息字符串到消息字节
    • 消息字节到散列字节
    • 哈希字节到哈希字符串(十六进制)
    • 反向哈希字符串(十六进制)

    下一次,检查每个步骤的输出,您将找出问题所在。

    (不明显 无论如何,您都希望反转十六进制输出,但那是另一回事。)

        2
  •  0
  •   snikitin-de    7 年前

    问题出现在哈希的输入行中(字符串是不包含其余数据的salt,其余数据为空,因为EditText的定义中存在错误(EditText返回空字符串),并且还修复了UTF-8的Java编码。