電子署名

電子署名 (Digital Signature) は文書に対する承認と、文書内容の保障を電子的に付け加えるための技術です。公開鍵を使用することにより他人によって行われた署名でない事、署名された時点から文書内容に変更がない事の 2 点を証明することができます。また電子署名法により 2001 年から電子商取引などにおける法的根拠としても使用できるようになりました。

電子署名を法的な保障付きで運用しようとすれば通常の公開鍵と同様のセキュリティが必要です。秘密鍵は署名者本人以外からアクセス可能であってはいけませんし、公開鍵は信頼の置ける第三者機関によって公開されなければいけません。

公開鍵が無効になれば署名の正当性を証明する手段もなくなります。CA が発行する公開鍵の証明書には数年程度の有効期限しかないため、現実世界の契約書のような長期間の管理が必要な文書には使用できません。

電子署名の原理

電子署名の実体は、文書から算出したハッシュ値公開鍵暗号で暗号化した数百バイト程度のバイナリデータです。ただし、暗号化に秘密鍵を使用する点が文書秘匿を目的とした場合と異なります。

署名の検証者は相手の公開鍵でその暗号が解除できるかどうかをもって対応する秘密鍵が使用された ─ つまりその所有者によって署名が行われたかどうかを検証することができます。そして署名から取り出したハッシュ値が文章のハッシュ値と一致していれば、その署名が行われてから文書に変更がないことを保障できます (公開鍵 暗号は非常に負荷の高い処理であるため、文書全体を暗号化する代わりにそれから算出 したハッシュ値を使用します)。

電子署名を信頼するには検証に使用する公開鍵が確実に相手のものであることを保障できなければいけません。また、秘密鍵を管理している側であればコンピュータの日時を巻き戻した上で改ざんした文書に再署名することも可能であることに注意する必要があります。

電子署名の作成と検証

Java で使用できる署名アルゴリズムこちらを参照。

アルゴリズムを指定して秘密鍵で初期化したSignature に対して、文書内容のバイナリデータで更新することで電子署名を算出することができます。生成される電子署名の実体は数百バイト程度のバイナリデータです。

Signature signature = Signature.getInstance("SHA256withRSA");
signature.initSign(privateKey);
signature.update(binary);
byte[] sign = signature.sign();

検証時は秘密鍵の代わりに公開鍵で初期化します。

Signature signature = Signature.getInstance("SHA256withRSA");
signature.initVerify(publicKey);
signature.update(binary);
boolean valid = signature.verify(sign);

これにより秘密鍵にアクセスできる人間しか署名を行うことができず、署名の検証は誰でも行うことができるようになります。