2011-12-27 5 views
2

私はbashで、次のコードを持っている:RSAキーで一般的なテキストに署名し、JavaでBase64でエンコードする方法は?

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

基本的には、このコードは、私はまったく同じでコードを実行する可能性がどのようにBase64で

を使用して、プレーンテキストを取る秘密鍵でサインをしてエンコードしJavaの機能ですか?

答えて

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)); 
    } 

EDIT: の例では、上記の内部日のエンコーダ(sun.misc.BASE64Encoder)を使用しています。 Commons CodecからBase64のようなものを使用するのが最善です。

+1

あなたのコードは、(bashのコードの例を参照)、ファイル形式の秘密鍵を負いません。 –

+1

ここには[サンプル](http://codeartisan.blogspot.com/2009/05/public-key-cryptography-in-java.html)のキーの読み方があります。キーがPKCS8形式であることを確認してください。 – tenorsax

+0

Java 8にはデコーダ 'java.util.Base64.getDecoder' –

2

また、not-yet-commons-sslを使用して、ファイルから秘密鍵を取得し、org.apache.commons.ssl.Base64を使用してエンコードすることができます。私はそれがはるかに便利な、まだ与えられた回答のいずれよりもだと思うので、私は、@Aquaが新しい答えとして掲載リンクをコピー

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)); 
+0

があります。新しいPKCS8Key(new FileInputStream(" keyfile.pem ")、" changeit ".toCharArray());これはまったく機能しません。このメソッドは保護されており、FileInputStreamと互換性のないその他の引数が必要です。 – VasyaNovikov

+0

@VasyaNovikovコードを明確にするためにインポートを追加しました。それは 'org.apache.commons.ssl.PKCS8Key'です、あなたは' sun.security.pkcs.PKCS8Key'を使用しようとしていると思います。混乱をおかけして申し訳ありません。 – superfav

1

:Maxの例を使用。署名と検証についてanythigを言っていません 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); 
関連する問題