簡體   English   中英

android中sha256哈希的錯誤計算

[英]wrong calculatin of sha256 hash in android

我在通過Android Studio為給定的字符串生成正確的哈希值時遇到問題。 我已經閱讀了很多解決方案,但不了解如何正確地進行轉換。 我需要正確的哈希,因為我正在使用它進行HTTP請求。

這是我在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

我認為我的問題是如何讀取/打印字符串,但我不知道如何糾正它。 我知道在線哈希計算器會返回正確的哈希值。 謝謝。

我將getHash修改為一個String ,刪除了對reset()的調用,然后完成了digest() 我也更喜歡for each循環 喜歡,

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
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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM