2016-10-20 14 views
0

のための既存の公開鍵を使用してJavaで署名を作成します。そうするために、私はアサーションを作成する必要があります。
「すべてのJWTアサーションは、3つのコンポーネント、ヘッダ、特許請求の範囲、および署名で構成されている
- ヘッダは、JWTの署名に使用するアルゴリズムを指定します
。クレームには正しいトークンを認証して提供するのに必要な情報が含まれています
- 署名はアプリケーションの識別情報を検証するために使用され、公開鍵を使用して検証されます

コード化され連結されると、JWTアサーションが表示されますこのように: eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9eyJpc3MiOiJ2Z3。 B2bWFvaDJjZ2ZjNGRuMzFnMWx0cmlhbmdlZCIsInN1YiI。 6IjE2ODczOTQzIiwiZXhwIjoxNDI5MDM3ODYwLCJqdGkiOiJ」だから
は、私はボックスのAPIにアクセスし、JWT(JSONウェブトークン)を使用して許可する...</p> <p>を私は再びあなたの助けが必要JWT

、RSA鍵ペアは、私が前に作成する必要がありましたし、ボックスdevolperアプリケーションで公開鍵を堆積する必要がありました。

ここで、署名の作成方法はわかりません。 鍵ペアを作成して解決策を見つけましたが、既にこれを持っているので、コードを修正する方法はわかりません。

import java.security.KeyPair; 
import java.security.KeyPairGenerator; 
import java.security.Signature; 

import sun.misc.BASE64Encoder; 

public class MainClass { 
    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)); 
    } 
} 
+1

[Java SDK for Box](https://github.com/box/box-java-sdk)を使用したことはありますか? JWTの認証フローを処理します。自分で書きたい場合は、[JWT実装](https://github.com/box/box-java-sdk/blob/master/src/main/java/com/box/sdk/)をチェックしてください。 BoxDeveloperEditionAPIConnection.java)からインスピレーションを受けています。 –

+0

鍵ペアを生成したら、何らかの形で鍵ペアを保存する必要があります。公開鍵用の1つのPEMファイルと秘密鍵用の1つのPEMファイルは、それを格納するための一般的な方法です。しかし、数週間前にあなたと同様のコードをセットアップしようとしたとき、PAMファイルをJava KeyPariに読み込むプロセスが非常に面倒で、非常に多くのライブラリが含まれていたため、MD5をRSAからHMAC-SHA256に切り替えることになりました。 –

答えて

0

ボックスAPIは

RSAキーペアが

だから、あなたがPEMにあなたの公開鍵をエクスポートする必要がPEM形式でなければなりませんと言います。

public final static void main(String argv[]) throws Exception{ 

    String header = "{\"alg\": \"RS256\",\"typ\": \"JWT\"}"; 
    String payload = "{\"sub\": \"1234567890\",\"name\": \"John Doe\"}"; 

    KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA"); 
    kpg.initialize(1024); 
    KeyPair keyPair = kpg.genKeyPair(); 

    String publicKeyPem = exportPublicKeyAsPem(keyPair.getPublic()); 
    String signedToken = signJWT (header, payload, keyPair.getPrivate()); 

    System.out.println(publicKeyPem); 
    System.out.println(signedToken); 
} 

:この方法で行うことができます署名JWTトークンを作成するこのコード(java8)

public static String exportPublicKeyAsPem(PublicKey publicKey) throws Exception { 
    StringWriter sw = new StringWriter(); 

    sw.write("-----BEGIN PUBLIC KEY-----\n"); 
    sw.write(Base64.getEncoder().encodeToString(publicKey.getEncoded())); 
    sw.write("\n-----END PUBLIC KEY-----\n"); 

    return sw.toString(); 
} 

を使用したコードを使用して

public static String signJWT (String header, String payload, PrivateKey privateKey) throws Exception{ 
    String token = 
      Base64.getUrlEncoder().encodeToString(header.getBytes()) 
      + "." 
      +Base64.getUrlEncoder().encodeToString(payload.getBytes()); 

    Signature sig = Signature.getInstance("SHA256WithRSA"); 
    sig.initSign(privateKey); 
    sig.update(token.getBytes()); 
    byte[] signature = sig.sign(); 

    return token + "." + Base64.getUrlEncoder().encodeToString(signature); 
} 

を(また、ライブラリを使用することができます)最後に、使用する前に鍵ペアと負荷を保存する必要があります。 opensslを使用してキーペアを事前生成することをお勧めします。BoxApi documentation says

関連する問題