2012-04-04 71 views
4

我試圖驗證soap web服務,但我在java中生成的SHA1哈希不起作用,但使用.Net生成的哈希工作正常。在.Net中生成的SHA1哈希等效於什麼?

這個.Net代碼的java等價物是什麼?

//.Net

var token = "H?OIgSJ35~LKJ:9~~7&sUtHDeKAv*[email protected]?cEwV[}[email protected]%}"; 
var shaProvider = new SHA1Managed(); 
var rawKey = Encoding.Unicode.GetBytes(token); 
var rawHash = shaProvider.ComputeHash(rawKey); 
var signature = BitConverter.ToString(rawHash).Replace("-", "").ToLower(); 

哈希生成:a508a29efeea2821e519fcbf64f164dd5d672233

//爪哇 - 這是我嘗試使用公地編解碼器1.4.jar

String token = "H?OIgSJ35~LKJ:9~~7&sUtHDeKAv*[email protected]?cEwV[}[email protected]%}"; 
MessageDigest cript = null; 
try { 
    cript = MessageDigest.getInstance("SHA1"); 
} catch (NoSuchAlgorithmException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 
cript.reset(); 
cript.update(token.getBytes()); 
String password = new String(Hex.encodeHex(cript.digest())); 
System.out.println(password); 

哈希產生: 88e7c8fc13ac75e8efc8d0c00182caa6dc087093

+0

這些相應的塊產生什麼字符串? – alberge 2012-04-04 10:36:16

+0

看起來'Encoding.Unicode.GetBytes'具有與'String.getBytes'不同的編碼。你有沒有試過比較這兩個輸出?嘗試'token.getBytes(「UTF-16LE」)'。 – 2012-04-04 10:42:52

+0

@alberge,在我的編輯中加入了那些 – Ram 2012-04-04 10:49:25

回答

4

我的猜測是token.getBytes()不使用與Encoding.Unicode.GetBytes(token)相同的編碼,因爲您不太可能將UTF-16 Little Endian用作默認字符集。如果將其更改爲token.getBytes(StandardCharsets.UTF_16LE),會發生什麼情況?

+0

我在哪裏可以找到StandardCharsets.UTF_16LE?我可以在rt.jar中找到一個,它是sun.nio.cs.StandardCharsets,但沒有UTF_16LE – Ram 2012-04-04 11:21:30

+1

@Mohan [java.nio.charset.StandardCharsets](http://docs.oracle.com/javase/7 /docs/api/java/nio/charset/StandardCharsets.html) – 2012-04-04 11:57:47

+0

@Banthar感謝您的回覆,但我無法在rt.jar中找到它。包含它的罐子是什麼? – Ram 2012-04-04 12:28:01