2014-11-14 149 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