1. ホーム
  2. node.js

[解決済み] SHA256で署名する場合とRSA-SHA256で署名する場合の違いについて

2022-03-09 05:46:54

質問

で遊んでいます。 デジタル署名 node.jsを使用しています。テスト用に、XMLデータのデジタル署名を作成しました。最初はSHA256のみ、次にRSA-SHA256を使用しました。

私が困惑しているのは どちらの署名方法でも、まったく同じ署名が作成されます。 . どちらの署名も同じものです。もし同じなら、なぜ2つの異なる方法(SHA256対RSA-SHA256)なのでしょうか?

以下にコードを記載します。

var crypto = require('crypto'),
    path   = require('path'),
    fs     = require('fs'),

    pkey_path = path.normalize('private_key.pem'),
    pkey = '';

function testSignature(pkey) {
    var sign1 = crypto.createSign('RSA-SHA256'),
        sign2 = crypto.createSign('SHA256');

    fs.ReadStream('some_document.xml')
        .on('data', function (d) {
            sign1.update(d);
            sign2.update(d);
        })
        .on('end', function () {
            var s1 = sign1.sign(pkey, "base64"),
                s2 = sign2.sign(pkey, "base64");

            console.log(s1);
            console.log(s2);
        });
}

// You need to read private key into a string and pass it to crypto module.
// If the key is password protected, program execution will stop and
// a prompt will appear in console, awaiting input of password.

testSignature(fs.readFileSync(pkey_path));

上のコードでは、ある文字列が出力され、それが署名となり、また全く同じ文字列が出力されます。これも同じデータの署名ですが、異なるアルゴリズムで作成されており、前のものと同一です。

解決方法は?

SHA256だけでは署名は作成できません。

SHA256はハッシュアルゴリズムです。つまり、任意の大量のデータを表す短いフィンガープリント番号を作成するアルゴリズムです。署名を生成するためには、この指紋を何らかの方法で処理し、ある秘密署名鍵の保有者を特定できるようにする必要がある。そのような処理の一つは、RSA 鍵ペアの秘密鍵を使用して指紋を暗号化し、他の人が関連する公開鍵を使用して結果を復号化し、秘密鍵の保持者が本当に署名者である必要があることを検証できるようにすることです。

crypto APIのコンテキストでは、RSA暗号化スキームが明示的に指定されていない場合の デフォルトの処理であるか、またはその処理の種類が sign RSA秘密鍵の場合はRSAを、DSA鍵の場合はDSAを、...と呼びます。