2017-02-01 9 views
4

ライセンス管理にlicense3jというJavaライブラリを使用しています。ライブラリは非対称暗号化を使用し、Bouncycastleに依存しています。 gpgコマンドを使用してライセンスファイルを作成し、公開鍵を使用してソフトウェア内のライセンスを確認します。これまでのところすべてがうまくいきました。しかし、生成された1,000個のライセンスでは、実際には有効です(約5/1000)が、正しく検証できない部分があります。この場合にはどうなりPGPOnePassSignature.verifyを呼び出すときに署名の長さが正しくない

:基本的な暗号の知識を持つ、私に

org.bouncycastle.openpgp.PGPRuntimeOperationException: unable to verify signature: Signature length not correct: got 511 but was expecting 512

音ではなく曖昧:org.bouncycastle.openpgp.PGPOnePassSignature.verify(PGPSignature)ライセンスがcom.verhas.licensor.License.setLicenseEncoded(InputStream)で検証する場合は、次の例外がスローされます。グーグルで過ごす時間は、「先導するゼロ」について何かがあることを私に告げた。したがって、与えられた例では、明らかに先行ゼロがどこかで取り除かれ(?)、比較するシグネチャデータの長さが一致しません。意味をなさない

ここでは問題がどこにあるのかわかりません。ライセンスファイルのの作成中ですか?基本的には、次のようにしています:

gpg --armor --local-user=name.of.software --sign 

ライセンスファイルは私たちに与えられます。

またはエラーが検証中に起こるのでしょうか?先行ゼロ問題に正しく対処するためにBouncycastle構成を変更する必要がありますか?それらのFAQはいくつかのヒントを示していますが、License3jsourceは決してCipherインスタンスを使用しないため、これを指定されたAPIに統合する方法が完全に失われています。

私はこれが明らかにあまりよく知られていないライブラリでは非常に特別な問題であると認識しています。したがって、私は少しのフィードバックや入力を感謝します。それは、はBouncyCastleは常にデータ間違って作成しただけで1.6後のJavaのバージョンで遭遇はBouncyCastleのバグは、ですが、Javaは、データ中1.7以来、それは検証中に受け入れるより厳密になったよう

答えて

4

が見えます。整数は、それのバイト表現が小さくなり、十分な先行ゼロを有する場合、それは、ファイルにシリアライズする際

はBouncyCastleは、正しい長さにパッドに署名を失敗しています。
Javaバージョン1.7以上では、RSA署名バイトが鍵と同じ長さになると予想されます。

はBouncyCastleは整数に(JavaのRSA JCEプロバイダから返された)RSA署名バイト配列を変換し、それは、その長さについての情報を破棄する。
Line 263 of the PGPSignatureGeneratorは、RSA署名バイトがJCEから返され、整数に変換される場所を示します。

この整数は最終的に、出力するストリームに、MPInteger#encodeを使用して書き込まれます。これは、基礎となるbigintegerのビット長を使用して書き込むデータ量を決定するだけです。

This answerあなたはこのaproximatleyすべての200例に1つ、どのバージョンのJavaが役割を果たしているを参照してください理由の詳細を説明します。

+0

マグヌスさん、本当に問題の理解に役立ってくれてありがとう!私は、管理しやすい努力でこの問題を解決する方法を提案していますか? BCのソースを踏んでも、私がフックできるポイントはありません。私が使用できる選択肢はありますか? – qqilihq

+1

残念ながら、バウンシーキャスルで修正するのは簡単ではないようですが、問題追跡ツールでバグを起こすことはできますが、どれだけ成功するかはわかりません。それぞれのライセンスを検証し、それが失敗した場合に再生成することができます。 – Magnus

+0

実際にはライセンスを再生成するという考えもありましたが、ライセンスが生成されるサーバーはJava環境では実行されていません。ライセンスを確認するためだけにJREをセットアップするのは巨大なピタだろう。私はそれについて紀元前に問題を提起しようとします。もう1つの質問:BCの横に暗号ライブラリが追加されているのか、GPGシグネチャの検証もJava APIのクラスで実行できるのでしょうか?結局のところ、存在する。 'java.security.Signature'クラスです。検証手順はあまり複雑すぎるとは思われないので、その機能を書き直すことも考えています。 – qqilihq

関連する問題