我面临一个奇怪的问题,即Windows客户端上的数字签名与Linux服务器上的数字签名不同。我知道如果编码不同会发生这种情况,所以我更改了所有代码以强制使用UTF-8。我还添加了一些硬编码字符串,以查看签名是否不同,并且它们是。
这是字符串:
"http%3a%2f%2fschemas.xmlsoap.org"
本地签名是:
23d8190409b19fcfb83586b317de8ef710bd485ab5277238f2f2d3fa5daa3660
服务器字符串是:
7bacef6d25665ae8df11f736b2612c8ebc92a160ee4ced4606c07e7a93a50338
以下是签名代码:
private String sign(String data) throws Exception {
InputStream input = getClass().getResourceAsStream(
securityWebApi.getSecurityFilterConfiguration().getAzureSignatureKey());
Reader reader = new InputStreamReader(input, "UTF-8");
byte[] key = IOUtils.toByteArray(reader, Charset.forName("UTF-8"));
LOG.debug("got key array : " + new String(key));
Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
SecretKeySpec secret_key = new SecretKeySpec(key, "HmacSHA256");
sha256_HMAC.init(secret_key);
String testSign = Hex
.encodeHexString(sha256_HMAC.doFinal("http%3a%2f%2fschemas.xmlsoap.org".getBytes("UTF-8")));
LOG.debug("test sign == " + testSign);
String testSign2 = "Bla"
+"bla";
LOG.debug("test sign2== " + Hex
.encodeHexString(sha256_HMAC.doFinal(testSign2.getBytes("UTF-8"))));
return Hex.encodeHexString(sha256_HMAC.doFinal(data.getBytes("UTF-8")));
}
所以所有的签名都不同。显然我在这里缺少一些基本的东西,但是什么? 谢谢你的帮助。
哦,是的,服务器代码在Oracle Weblogic 11g中运行。
当然,我仔细检查了私钥是否相等,而且它们是。
答案 0 :(得分:0)
好的,问题是只在Linux中使用LF读取密钥文件,签名验证在Windows Server上完成。使用CRLF读取了相同的密钥文件,因此这是一个不同的密钥(字节数组)。
我们更改了代码,以便Windows上签名的验证将从密钥字符串中删除CR字符。