我想散列一個數字,用十六進制字符串表示的Java安全庫。意思是,如果我有字符串「AABBCCDD」,我想散列它不是因爲這是一個ascii輸入,它是0x65,0x65,0x66,0x66,0x67,0x67,0x68,0x68,但作爲四個字節 - 0xAA,0xBB, 0xCC,0xDD。 我設法用較低的值做到這一點,例如「112233445566」(因爲字節是用Java簽名的),但是失敗的數值很高。SHA1哈希十六進制字符串
有人知道如何實施這樣的事情嗎?
感謝, 本雅明
我想散列一個數字,用十六進制字符串表示的Java安全庫。意思是,如果我有字符串「AABBCCDD」,我想散列它不是因爲這是一個ascii輸入,它是0x65,0x65,0x66,0x66,0x67,0x67,0x68,0x68,但作爲四個字節 - 0xAA,0xBB, 0xCC,0xDD。 我設法用較低的值做到這一點,例如「112233445566」(因爲字節是用Java簽名的),但是失敗的數值很高。SHA1哈希十六進制字符串
有人知道如何實施這樣的事情嗎?
感謝, 本雅明
首先轉換十六進制爲byte[]
例如使用這樣的:Convert a string representation of a hex dump to a byte array using Java?
它使用
byte[] data = hexStringToByteArray(hexData);
MessageDigest md = MessageDigest.getInstance("SHA-1");
md.update(data, 0, data.length);
byte[] sha1hash = md.digest();
基本上你只需要找到一個十六進制解析器 - 有大量各地,擁有one example here,或Apache Commons Codec這和其他的轉換。雖然Java字節確實已簽名,但您將得到與未簽名相同的位模式,因此它們將採用相同的方式。除非你在字節值上執行自己的算術/位移,否則通常忽略字節用Java簽名的事實。
謝謝,正如我寫給gleber(上圖),我已經實現了你的第一個選項。 – MByD 2010-12-02 08:09:21
這些不說,採取的方法後'的byte []`作爲輸入?我不太確定我是否明白問題所在。 – 2010-12-02 07:39:11
是的。我假設我在執行之前犯了一些錯誤。 – MByD 2010-12-02 08:10:13