【问题标题】:Converting openssl digest signing statement to Java code将 openssl 摘要签名语句转换为 Java 代码
【发布时间】:2019-02-06 10:42:14
【问题描述】:

我正在尝试将 OpenSSL linux 语句转换为 Java 代码,但到目前为止,我得到了不同的结果。这是关于以下声明:

echo "testString" | openssl dgst -sha256 -sign private.key -passin "pass:passw0rd" | openssl base64 -A

这个回显的结果如下:

6FFS + VYM + Su887Mq0YG1OsURb7Csw9czvycShEd2P6SHQYKE7O6V / wzi5XTGJcP / sTaHvOAIZ5g8cIs5SEKD8NGaMLPD35hnNAn1nlAVfBT826pwIjUvzJII7d2aHKTjVfIhsyUEXbRtSMrrJNrtfyCTYYYOxCWzZv0RiOczQlpy1Jaa46fSacvaRKXi9xV / W1KxYcNS8wc / mc3Ujeqc4gfESb2YJU8yP3P269iENCjDq ++ 8CTyEj4vm4XxlXYBIREEK7qUfxTTo1 + XKfBck / 0 / + RGwZD26jhRNHKMI6maW0mB == fRLjnYIvBqQKRbZnoIEmjy8AYy8CGC56Ujh2r3dg P>

现在我正在尝试以下 Java 代码:

public String encryptString(byte[] data) {
    try {
        java.security.Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());

        Resource keyStore = ctx.getResource(keystoreLocation);
        PrivateKey privateKey = loadPrivateKey(keyStore.getInputStream());

        Signature signature = Signature.getInstance("SHA256withRSA", "BC");
        signature.initSign(privateKey);
        signature.update(data);
        String result = Base64.getEncoder().encodeToString(signature.sign());

        // return Base64.getEncoder().encodeToString(signature.sign());
        return null;
    } catch (Exception e) {
        log.error("Something went wrong during encryption.");
        throw new RuntimeException(e);
    }
}

此代码以不同于 linux 语句的编码结果结束:

uxdvp2oTaoS / Iln9KYNL + 2o49fbW2Br0jIt9cc / F3xRm3XnsEVVBzKA0vL9yMCAvNvH0nfBt2nRHQzL5PtN + uLy0pKCtHBKxfgdTZjnhm0qdj6tcOIvx3f1AkrMhXAk6bfEMqxu5dEl8AJ2wvYvggyBDXn + Bv0TG + 2iavNZ80RDqILExQvGSnD7O9BSPtOVtf17ahyzagYNiqEGxdqLUSZHNNs7Q10hYpeJ7cB6Jg / NRUGFS5Z14xmvjqyk63VFXw86hCvX1rnDt3vL7XRdSRKMhiI9SfnSHbNSNEMcSBRxX6nb1nkuuqjjzNBXZAduNAOBzIrrROmwQkXVOFKXDCw == P>

我还尝试了其他一些方法。我尝试使用 Cipher 实现:

Cipher cipher = Cipher.getInstance("RSA/None/NoPadding", "BC");
cipher.init(Cipher.ENCRYPT_MODE, privateKey);

byte[] hash = digest.digest(data);
byte[] signature = cipher.doFinal(hash);

String hashEncoded = Base64.getEncoder().encodeToString(hash);
String signatureEncoded = Base64.getEncoder().encodeToString(hash);

但是所有的字符串最终都比预期的要短。我还看到了“dgst”声明,所以我想知道我必须消化消息(使用MessageDigest digest = MessageDigest.getInstance("SHA-256", "BC");)但在这里我遇到了同样的问题,更短的字符串。

有人知道我在这里做错了什么吗?

【问题讨论】:

  • 您尝试对字符串“testString”进行签名。你检查过你用来把那个字符串转成byte[] dataJava参数的编码是否和openssl应用于字符串数据输入的编码一样吗?
  • 话虽如此,如果没有您的公钥,签名的转储根本没有帮助(除了看到它们不同)。因此,您可以分享您的公钥吗?
  • 我通过更改一些代码以强制匹配 linux 终端来验证编码。并感谢您的建议。

标签: java encryption openssl digital-signature digest


【解决方案1】:

这里的问题很简单,也不是特别有趣。 echo "testString" 将换行符附加到正在回显的字符串。对于大多数版本的 echo,-n 选项将禁止换行。或者,同样好,您可以在 java 版本中添加换行符,例如:

signature.update("testString\n".getBytes(StandardCharsets.UTF_8));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-28
    • 1970-01-01
    • 1970-01-01
    • 2012-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多