2014-11-14 148 views
1

我有一个问题,由android studio生成给定字符串的正确哈希。我已经阅读了很多解决方案,但没有理解如何正确转换它。 我需要正确的散列,因为我使用它发出HTTP请求。在android中的sha256哈希计算错误

这是我在Java代码:

public String getHash(final String appSecret , final String sessionToken)throws NoSuchAlgorithmException ,UnsupportedEncodingException{ 

     String input = sessionToken + appSecret; 
     MessageDigest digest = MessageDigest.getInstance("SHA-256"); 
     digest.reset(); 

     byte[] byteData = digest.digest(input.getBytes("UTF-8")); 
     StringBuffer sb = new StringBuffer(); 

     for (int i = 0; i < byteData.length; i++){ 
      sb.append(String.format("%02x", 0xFF & byteData[i])); 
     } 
     return sb.toString(); 

    } 

对于像输入:

1130_11825_253402300799_1_1bcb4a27d42524de11325ec627b63878770a8651c0a0d8ddfc8fc06b92aea281634ff11f7d874c03851932304601439e 

我需要确切的输出:

01a9d698f0587a25ad8ef56b0994ec0022364aff91d668a4b3a4b97c40167672 

,但我得到一个错误的输出:

a60f61b5e9f832b153a91e8d2b1ffa28b9611b2d60c3669663cfe050ac8e28cc 

我想我的问题是如何读取/打印字符串,但我无法弄清楚如何纠正它。 我知道一个在线哈希计算器返回一个正确的哈希。 谢谢。

回答

0

我修改了getHash取一个String,我删除了电话reset(),并且您完成digest()。我也更喜欢for each loop。像,

public static String getHash(final String msg) { 
    StringBuilder sb = new StringBuilder(); 
    try { 
     MessageDigest digest = MessageDigest.getInstance("SHA-256"); 
     digest.update(msg.getBytes()); 
     byte[] byteData = digest.digest(); 
     for (byte x : byteData) { 
      String str = Integer.toHexString(Byte.toUnsignedInt(x)); 
      if (str.length() < 2) { 
       sb.append('0'); 
      } 
      sb.append(str); 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    return sb.toString(); 
} 

,并调用它像

public static void main(String[] args) { 
    String out = getHash("1130_11825_253402300799_1_1bcb4a27d42524de11325ec627b63878770a8651c0a0d8ddfc8fc06b92aea281634ff11f7d874c03851932304601439e"); 
    String expected = "01a9d698f0587a25ad8ef56b0994ec0022364aff91d668a4b3a4b97c40167672"; 
    System.out.println(out.equals(expected)); 
} 

我得到

true 
+1

谢谢,这是非常有益的。如果您想使用此代码,请注意您发送的字符串。确保它没有空白或没有新的线条。 – Nimo 2014-11-15 08:53:56

0
import static org.junit.Assert.assertEquals; 

import java.security.MessageDigest; 
import java.security.NoSuchAlgorithmException; 

import org.junit.Test; 

public class Sha256Test { 

    @Test 
    public void sha256Test() throws NoSuchAlgorithmException { 
     String out = hash256("1130_11825_253402300799_1_1bcb4a27d42524de11325ec627b63878770a8651c0a0d8ddfc8fc06b92aea281634ff11f7d874c03851932304601439e"); 
     String in = "01a9d698f0587a25ad8ef56b0994ec0022364aff91d668a4b3a4b97c40167672"; 
     assertEquals(in, out); 
    } 

    private String hash256(String data) throws NoSuchAlgorithmException { 
     MessageDigest md = MessageDigest.getInstance("SHA-256"); 
     md.update(data.getBytes()); 
     return bytesToHex(md.digest()); 
    } 

    private String bytesToHex(byte[] bytes) { 
     StringBuffer result = new StringBuffer(); 
     for (byte byt : bytes) { 
      result.append(Integer.toString((byt & 0xff) + 0x100, 16).substring(1)); 
     } 
     return result.toString(); 
    } 
} 

参见:https://gist.github.com/avilches/750151