代码之家  ›  专栏  ›  技术社区  ›  philgiese

android sha224与python sha224的区别

  •  3
  • philgiese  · 技术社区  · 14 年前

    对于一个应用程序原型,我正在创建一个简单的用户登录。然后使用sha224对用户的密码进行散列并传输到后端。我现在面临的问题如下。数据库中存储的密码(也使用sha224散列)看起来与我发送的散列稍有不同。我使用以下代码创建散列。

    给定密码==测试

    蟒蛇

    from hashlib import sha224
    sha224("test").hexdigest()
    

    安卓

    MessageDigest sha224 = MessageDigest.getInstance("SHA-224");
    sha224.update(key.getBytes());
    
    byte[] digest = sha224.digest();
    StringBuffer buffer = new StringBuffer();
    
    for(int i = 0; i < digest.length; i++) {
     buffer.append(String.valueOf(Integer.toHexString(0xFF & digest[i])));
    }
    
    return buffer.toString();
    

    现在要制作的是这样的,我将把这两个散列放在彼此的正下方。(第一个是python,第二个是android)

    90A3ED9E32B2AAF4C61C410EB92542619E1A9DC53D4286ADE99A809 90A3ED9E32B2AAF4C61C41EB92542619E1A9DC53D4286ADE99A89

    它们几乎相同,但python散列还有20个。你们知道为什么吗?

    3 回复  |  直到 12 年前
        1
  •  4
  •   Ignacio Vazquez-Abrams    14 年前

    您没有正确格式化Android上的十六进制值;前面的0将被删除。

    buffer.append(String.format("%02x", 0xFF & digest[i]));
    
        2
  •  0
  •   Alex Orlov    14 年前
    final MessageDigest mDigest = MessageDigest.getInstance("SHA-224");
    byte[] messageDigest = mDigest.digest(toEncrypt.getBytes());
    final BigInteger number = new BigInteger(1, messageDigest);
    final String sha = number.toString(16);
    final int diff = 32 - sha.length();
    final StringBuilder finalSHA = new StringBuilder(32);
    for (int i=0;i<diff;i++) {
     finalSHA.append("0");
    }
    finalSHA.append(sha);
    return finalSHA.toString();
    
        3
  •  0
  •   whatnick    14 年前

    将十六进制转换为字符串,一次两对。第一个零就是 dropped 在23号,一个奇怪的位置。这是一个前导零。必要时需要将转换后的十六进制数字归零。不带BigInteger的替代实现:

    MessageDigest sha224 = MessageDigest.getInstance("SHA-224");
    sha224.update(key.getBytes());
    
    byte[] digest = sha224.digest();
    StringBuffer buffer = new StringBuffer();
    
    for(int i = 0; i < digest.length; i++) {
      String hex_string = Integer.toHexString(0xFF & digest[i]);
      if(hex_string.length()==1) hex_string = "0"+hex_string;
      buffer.append(hex_string);
    }
    
    return buffer.toString();