繁体   English   中英

如何在Java中使用RSA密钥对通用文本进行签名并使用Base64进行编码?

[英]How to sign a generic text with RSA key and encode with Base64 in Java?

我在bash中有以下代码:

signed_request = $(printf "PLAIN TEXT REQUEST" | 
openssl rsautl -sign -inkey "keyfile.pem" | openssl enc -base64 | _chomp )

基本上,此代码采用纯文本,使用私钥对其进行签名,然后使用Base64进行编码

如何用Java中完全相同的功能编写代码?

您可以使用JDK安全API 看一下这个工作示例 ,希望它可以帮助您入门:

  public static void main(String[] args) throws Exception {
    KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
    kpg.initialize(1024);
    KeyPair keyPair = kpg.genKeyPair();

    byte[] data = "test".getBytes("UTF8");

    Signature sig = Signature.getInstance("MD5WithRSA");
    sig.initSign(keyPair.getPrivate());
    sig.update(data);
    byte[] signatureBytes = sig.sign();
    System.out.println("Singature:" + new BASE64Encoder().encode(signatureBytes));

    sig.initVerify(keyPair.getPublic());
    sig.update(data);

    System.out.println(sig.verify(signatureBytes));
  }

编辑:上面的示例使用内部Sun的编码器( sun.misc.BASE64Encoder )。 最好使用Commons Codec Base64之类的东西。

另外,您可以使用not-yet-commons-ssl从文件获取私钥,并使用org.apache.commons.ssl.Base64进行编码。 使用Max的示例:

import java.security.Signature;
import org.apache.commons.ssl.Base64;
import org.apache.commons.ssl.PKCS8Key;

// [...]

PKCS8Key pkcs8 = new PKCS8Key(new FileInputStream("keyfile.pem"),
                              "changeit".toCharArray());

Signature sig = Signature.getInstance("MD5WithRSA");
sig.initSign(pkcs8.getPrivateKey());
sig.update(data);
byte[] signatureBytes = sig.sign();

System.out.println("Singature: " +
                   Base64.encodeBase64String(signatureBytes));

我复制发布为新答案的@Aqua链接,因为我认为FAR比任何给出的答案都有用。 使用THIS从文件中读取/写入私钥/公钥: http : //codeartisan.blogspot.ru/2009/05/public-key-cryptography-in-java.html

该链接未提及有关签名和验证的任何内容,但是签名要容易得多。 我使用以下代码进行签名:

    Signature signature = Signature.getInstance("SHA256WithRSA");
    signature.initSign(privateKey);

    signature.update("text to sign".getBytes());
    signature.sign();

并验证:

    Signature signature = Signature.getInstance("SHA256WithRSA");
    signature.initVerify(publicKey);
    signature.update("text to sign".getBytes);
    signature.verify(signatureMadeEarlier);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM