首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将openssl摘要签名语句转换为Java代码

问将openssl摘要签名语句转换为Java代码
EN

Stack Overflow用户
提问于 2019-02-06 10:42:14
回答 1查看 417关注 0票数 1

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

代码语言:javascript
复制
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==

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

代码语言:javascript
复制
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==

我也尝试过其他的方法。我尝试使用密码实现:

代码语言:javascript
复制
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");),但是这里我遇到了同样的问题,短得多的字符串。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-06 23:59:04

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

代码语言:javascript
复制
signature.update("testString\n".getBytes(StandardCharsets.UTF_8));
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54551655

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档