我遇到了一个奇怪的问题,即 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 中运行。
当然,我仔细检查了私钥是否相等,它们是相等的。
最佳答案
好的,问题是 key 文件是在 Linux 中仅使用 LF 读取的,签名的验证是在 Windows 服务器上完成的。使用 CRLF 读取了相同的 key 文件,因此这是一个不同的 key (字节数组)。
我们更改了代码,以便在 Windows 上验证签名将从 key 字符串中删除 CR 字符。
关于Java:Linux 服务器上的数字签名与 Windows 客户端上的数字签名不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37549624/