有効なタイムスタンプを生成するには、CMSSignedDataオブジェクトのどのデータを渡す必要がありますか?

Broken_Window

有効なPKCS7ファイルがCMSSignedDataオブジェクトにロードされています。このPKCS7ファイルには、プレーンテキストメッセージと有効な添付デジタル署名が含まれています(すべて同じファイル内にあります)。

次に、このファイルにタイムスタンプを付けます。これは私が使用しているコードです(ソース):

 private static CMSSignedData addTimestamp(CMSSignedData signedData)
throws Exception {
        Collection ss = signedData.getSignerInfos().getSigners();
        SignerInformation si = (SignerInformation) ss.iterator().next();

        TimeStampToken tok = getTimeStampToken();

        ASN1InputStream asn1InputStream = new ASN1InputStream
(tok.getEncoded());
        DERObject tstDER = asn1InputStream.readObject();
        DERSet ds = new DERSet(tstDER);

        Attribute a = new Attribute(new
DERObjectIdentifier("1.2.840.113549.1.9.16.2.14"), ds);
        DEREncodableVector dv = new DEREncodableVector();
        dv.add(a);
        AttributeTable at = new AttributeTable(dv);
        si = SignerInformation.replaceUnsignedAttributes(si, at);
        ss.clear();
        ss.add(si);
        SignerInformationStore sis = new SignerInformationStore(ss);

        signedData = CMSSignedData.replaceSigners(signedData, sis);
        return signedData;
    }


 private static TimeStampToken getTimeStampToken() throws
Exception {
        Security.addProvider (new
org.bouncycastle.jce.provider.BouncyCastleProvider());

        PostMethod post = new PostMethod("http://My-TrustedTimeStampProvier.com");

// I'm omitting the part where I pass the user and password

        TimeStampRequestGenerator reqGen = new TimeStampRequestGenerator();
        //request TSA to return certificate
        reqGen.setCertReq (true); // In my case this works

        //make a TSP request this is a dummy sha1 hash (20 zero bytes)
        TimeStampRequest request =
            reqGen.generate(TSPAlgorithms.SHA1, new byte[20], BigInteger.valueOf(100));

        byte[] enc_req = request.getEncoded();
        ByteArrayInputStream bais = new ByteArrayInputStream(enc_req);

        post.setRequestBody(bais);
        post.setRequestContentLength (enc_req.length);
        post.setRequestHeader("Content-type","application/timestamp-query");

        HttpClient http_client = new HttpClient();
        http_client.executeMethod(post);
        InputStream in = post.getResponseBodyAsStream();

        //read TSP response
        TimeStampResponse resp = new TimeStampResponse (in);

        resp.validate(request);

        TimeStampToken  tsToken = resp.getTimeStampToken();       
        return tsToken;
    }  

有効なTimeStampを取得でき、それをCMSSignedDataオブジェクトに入れて、signedData.getEncoded()からハードディスクにバイトを書き込むファイルに保存できます。しかし、サードパーティのソフトウェア新しい光沢のあるタイムスタンプ付きファイルを検証すると、このソフトウェアは元の署名に問題がないことを通知しますが、タイムスタンプは署名に対応していません。このソフトウェアは、元のプレーンテキストメッセージを表示することもできます。

私は問題がこの行にあると思います:

TimeStampRequest request =
    reqGen.generate(TSPAlgorithms.SHA1, new byte[20], BigInteger.valueOf(100));

ダミーのバイト配列の代わりにダイジェストを渡す必要があると思いますが、どのダイジェスト、またはtimeStampに必要な正しいバイトは何かわかりません。SignerInformationからオブジェクトを取得して検証することに成功しましたsignedData次にreqGen.generate()、からのバイトを関数に渡そうとしましたmySignerInformation.getSignature()タイムスタンプの検証に失敗しました。次に、のSha1ダイジェストを渡しましたmySignerInformation.getSignature()が、タイムスタンプの検証に再度失敗しました。

RFC3161の仕様は言います:

2.4.1。リクエストフォーマット

タイムスタンプの要求は次のとおりです。

TimeStampReq :: = SEQUENCE {バージョンINTEGER {v1(1)}、messageImprint MessageImprint、-ハッシュアルゴリズムのOIDとデータのハッシュ値

(...)

messageImprintフィールドには、タイムスタンプを付けるデータのハッシュを含める必要があります。ハッシュはOCTETSTRINGとして表されます。その
長さは、そのアルゴリズムのハッシュ値の長さと一致する必要があります
(たとえば、SHA-1の場合は20バイト、MD5の場合は16バイト)。

MessageImprint :: = SEQUENCE {hashAlgorithm AlgorithmIdentifier、hashedMessage OCTET STRING}

ただし、CMSSignedDataオブジェクト内のバイトをタイムスタンプする場合、MessageImprintデータをどこでどのように取得するかはわかりません。

私はこのデジタル署名の初心者です。

albciff

そうです、問題は、間違ったデータにタイムスタンプを付けていることです。コードの残りの部分は私には正しいようです。

つまり、署名のハッシュにタイムスタンプを付ける必要があります。から署名を取得してCMSSignedDataハッシュするには、次のコードを使用できます(署名者が1人だけで、ハッシュアルゴリズムPKCS7を使用している仮定しますSHA1)。

CMSSignedData signedData = ...
// get the signers of your CMSSignedData signedData
Collection ss = signedData.getSignerInfos().getSigners();
SignerInformation si = (SignerInformation) ss.iterator().next();
// hash the signature
byte[] signDigest = MessageDigest
      .getInstance(TSPAlgorithms.SHA1, new BouncyCastleProvider())
      .digest(si.getSignature()); // since you're adding the bc provider with Security.addProvider you can use "BC" instead of passing the new BouncyCastleProvider() 
TimeStampRequestGenerator reqGen = new TimeStampRequestGenerator();
// generate the TSRequest
TimeStampRequest request =
            reqGen.generate(TSPAlgorithms.SHA1, signDigest, BigInteger.valueOf(100));
...

お役に立てれば、

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

有効なタイムスタンプを生成するには、CMSSignedDataオブジェクトのどのデータを渡す必要がありますか?

分類Dev

タイプTのオブジェクトの値を更新するには、どのデザインパターンを使用する必要がありますか

分類Dev

オブジェクトに重いものを渡す必要がある場合、ポインタまたはコピーで渡す必要がありますか?

分類Dev

さまざまなクラスのさまざまなコンストラクターを受け入れるようにするには、オブジェクトにどのタイプを宣言する必要がありますか

分類Dev

コンストラクターで実際のクラスオブジェクトの代わりにインターフェイスタイプのオブジェクトを使用する必要があるのはなぜですか

分類Dev

DynamoDBのタイムスタンプにはどのデータ型を使用する必要がありますか?

分類Dev

特定の長さのオブジェクトの配列を作成する関数を作成するにはどうすればよいですか?オブジェクトにはカスタム生成されたデータがあります

分類Dev

副作用を回避するために、ゲッターはオブジェクトインスタンスのコピーを返す必要がありますか?

分類Dev

サイトコアでカスタムコンテンツエディター([エディター]タブ)を作成する場合、別のVSプロジェクトでaspxページが必要な場合のURLの形式はどうなりますか

分類Dev

noImplicitAnyフラグを有効にしてtypescriptをコンパイルするときに、「オブジェクトタイプのインデックスシグネチャには暗黙的に「any」タイプがあります」というエラーを防ぐにはどうすればよいですか?

分類Dev

オンラインのプロジェクト管理データベースを作成するには、何を学ぶ必要がありますか?

分類Dev

.txtのデータを操作するには、どの構造化データオブジェクトを使用する必要がありますか?

分類Dev

TreeMapの場合、独自のクラスオブジェクトをキーとして渡すと、ComparableまたはComparatorのどちらのインターフェイスを実装する必要がありますか。その理由は何ですか。

分類Dev

forループのインデックスをボタンオブジェクトのクリック関数に渡す方法はありますか(jQueryUI-dialog)?

分類Dev

オブジェクトのすべてのフィールドのインターフェイスを定義するには、TypeScriptの他のインターフェイスのインスタンスである必要がありますか?

分類Dev

オブジェクトレストプロップにはどのタイプを宣言する必要がありますか?

分類Dev

APIで具体的なオブジェクトの代わりにインターフェースを公開する必要がありますか?

分類Dev

この関数はどのタイプのオブジェクトを返す必要がありますか?

分類Dev

同じパンダのDatetimeIndexオブジェクトに異なるタイムゾーンのタイムスタンプがありますか?

分類Dev

RXJSサブジェクトのサブスクライブ-アクションはプレーンオブジェクトである必要があります。非同期アクションにカスタムミドルウェアを使用する

分類Dev

オブジェクトでSqliteデータベースを更新するときに、エラー「タイプ 'セッション'はタイプ 'Map <String、dynamic>'のサブタイプではありません」をどのように解決しますか?

分類Dev

オブジェクトの作成中に、両方のひし形演算子にデータのタイプを指定する必要がありますか?

分類Dev

カスタムHttpParameterBindingを作成するには、どのHttpConfigurationオブジェクトにアクセスする必要がありますか?

分類Dev

「オブジェクトの正確なタイプを尋ねる」必要があることは、常に悪いデザインを示していますか?

分類Dev

タイムラインにはどのタイプのリストを使用する必要がありますか?

分類Dev

デストラクタを手動で呼び出すと、エラーが発生します。式は完全なオブジェクトタイプへのポインタである必要があります

分類Dev

小道具の一致オブジェクトを参照するには、どのTypeScriptタイプを使用する必要がありますか?

分類Dev

構造体フィールドオブジェクトタイプを宣言するときに、ここでどのようなライフタイムパラメータを使用する必要がありますか

分類Dev

Androidプラットフォームのインターフェイスでオブジェクトを参照する必要があります

Related 関連記事

  1. 1

    有効なタイムスタンプを生成するには、CMSSignedDataオブジェクトのどのデータを渡す必要がありますか?

  2. 2

    タイプTのオブジェクトの値を更新するには、どのデザインパターンを使用する必要がありますか

  3. 3

    オブジェクトに重いものを渡す必要がある場合、ポインタまたはコピーで渡す必要がありますか?

  4. 4

    さまざまなクラスのさまざまなコンストラクターを受け入れるようにするには、オブジェクトにどのタイプを宣言する必要がありますか

  5. 5

    コンストラクターで実際のクラスオブジェクトの代わりにインターフェイスタイプのオブジェクトを使用する必要があるのはなぜですか

  6. 6

    DynamoDBのタイムスタンプにはどのデータ型を使用する必要がありますか?

  7. 7

    特定の長さのオブジェクトの配列を作成する関数を作成するにはどうすればよいですか?オブジェクトにはカスタム生成されたデータがあります

  8. 8

    副作用を回避するために、ゲッターはオブジェクトインスタンスのコピーを返す必要がありますか?

  9. 9

    サイトコアでカスタムコンテンツエディター([エディター]タブ)を作成する場合、別のVSプロジェクトでaspxページが必要な場合のURLの形式はどうなりますか

  10. 10

    noImplicitAnyフラグを有効にしてtypescriptをコンパイルするときに、「オブジェクトタイプのインデックスシグネチャには暗黙的に「any」タイプがあります」というエラーを防ぐにはどうすればよいですか?

  11. 11

    オンラインのプロジェクト管理データベースを作成するには、何を学ぶ必要がありますか?

  12. 12

    .txtのデータを操作するには、どの構造化データオブジェクトを使用する必要がありますか?

  13. 13

    TreeMapの場合、独自のクラスオブジェクトをキーとして渡すと、ComparableまたはComparatorのどちらのインターフェイスを実装する必要がありますか。その理由は何ですか。

  14. 14

    forループのインデックスをボタンオブジェクトのクリック関数に渡す方法はありますか(jQueryUI-dialog)?

  15. 15

    オブジェクトのすべてのフィールドのインターフェイスを定義するには、TypeScriptの他のインターフェイスのインスタンスである必要がありますか?

  16. 16

    オブジェクトレストプロップにはどのタイプを宣言する必要がありますか?

  17. 17

    APIで具体的なオブジェクトの代わりにインターフェースを公開する必要がありますか?

  18. 18

    この関数はどのタイプのオブジェクトを返す必要がありますか?

  19. 19

    同じパンダのDatetimeIndexオブジェクトに異なるタイムゾーンのタイムスタンプがありますか?

  20. 20

    RXJSサブジェクトのサブスクライブ-アクションはプレーンオブジェクトである必要があります。非同期アクションにカスタムミドルウェアを使用する

  21. 21

    オブジェクトでSqliteデータベースを更新するときに、エラー「タイプ 'セッション'はタイプ 'Map <String、dynamic>'のサブタイプではありません」をどのように解決しますか?

  22. 22

    オブジェクトの作成中に、両方のひし形演算子にデータのタイプを指定する必要がありますか?

  23. 23

    カスタムHttpParameterBindingを作成するには、どのHttpConfigurationオブジェクトにアクセスする必要がありますか?

  24. 24

    「オブジェクトの正確なタイプを尋ねる」必要があることは、常に悪いデザインを示していますか?

  25. 25

    タイムラインにはどのタイプのリストを使用する必要がありますか?

  26. 26

    デストラクタを手動で呼び出すと、エラーが発生します。式は完全なオブジェクトタイプへのポインタである必要があります

  27. 27

    小道具の一致オブジェクトを参照するには、どのTypeScriptタイプを使用する必要がありますか?

  28. 28

    構造体フィールドオブジェクトタイプを宣言するときに、ここでどのようなライフタイムパラメータを使用する必要がありますか

  29. 29

    Androidプラットフォームのインターフェイスでオブジェクトを参照する必要があります

ホットタグ

アーカイブ