Java:Linux 服务器上的数字签名与 Windows 客户端上的数字签名不同

标签 java linux signing

我遇到了一个奇怪的问题,即 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/

相关文章:

Linux:检查文件描述符是否可供读取

linux - 如何在 awk 中使用 cut 命令?

java - 允许使用 iText 签署 pdf

java - 为什么我会收到运行时错误 :StringIndexOutOfBounds?

java - 从 Canvas 元素查询 MySQL 数据库?

java - Java中多重继承相关的混淆

java - 如何重新启动存储在数据库中的 Quartz 作业?

c - Linux:如何确定文件是否已被另一个进程更新?

php - 谷歌存储桶的签名 URL 与提供的签名不匹配

Java 输入流转换/签名问题