2012-04-04 76 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