我在bash中有以下代码:
signed_request = $(printf "PLAIN TEXT REQUEST" |
openssl rsautl -sign -inkey "keyfile.pem" | openssl enc -base64 | _chomp )
基本上,此代码采用纯文本,使用私钥对其进行签名并使用Base64进行编码
如何在Java中使用完全相同的功能执行代码?
答案 0 :(得分:3)
您可以使用JDK security API。看看这个有效的sample,希望它可以让你开始:
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之类的内容。
答案 1 :(得分:2)
此外,您可以使用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));
答案 2 :(得分:1)
我复制链接@Aqua作为新答案发布,因为我认为它比任何给出的答案更有用。使用此文件从文件读取/写入私钥/公钥: 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);