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

我在bash中有以下代码:

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

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

我怎样才能在Java中使用完全相同的function执行代码?

您可以使用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作为新答案发布,因为我认为它比任何给出的答案更有用。 使用此文件从文件读取/写入私钥/公钥: http : //codeartisan.blogspot.ru/2009/05/public-key-cryptography-in-java.html

该链接并未说明有关签名和validation的任何信息,但签名要容易得多。 我用这段代码签名:

  Signature signature = Signature.getInstance("SHA256WithRSA"); signature.initSign(privateKey); signature.update("text to sign".getBytes()); signature.sign(); 

并validation:

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