Java:linux 服务器上的数字签名与 windows 客户端上的数字签名不同
Java: digital signature different on linux server than on windows client
我遇到了一个奇怪的问题,即 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 中是 运行。
当然,我仔细检查了私钥是否相等,确实如此。
好的,问题是密钥文件是在 Linux 中仅使用 LF 读取的,签名验证是在 Windows 服务器上完成的。使用 CRLF 读取了相同的密钥文件,因此这是一个不同的密钥(字节数组)。
我们更改了代码,以便 Windows 上的签名验证将从密钥字符串中删除 CR 字符。
我遇到了一个奇怪的问题,即 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 中是 运行。
当然,我仔细检查了私钥是否相等,确实如此。
好的,问题是密钥文件是在 Linux 中仅使用 LF 读取的,签名验证是在 Windows 服务器上完成的。使用 CRLF 读取了相同的密钥文件,因此这是一个不同的密钥(字节数组)。
我们更改了代码,以便 Windows 上的签名验证将从密钥字符串中删除 CR 字符。