電子署名
電子署名 (Digital Signature) は文書に対する承認と、文書内容の保障を
電子的に付け加えるための技術です。公開鍵を使用することにより他人によって
行われた署名でない事、署名された時点から文書内容に変更がない事の 2 点を
証明することができます。また電子
署名法
により 2001 年から電子商取引などにおける法的根拠としても
使用できるようになりました。
電子署名を法的な保障付きで運用しようとすれば通常の公開鍵と同様のセキュリティが
必要です。秘密鍵は署名者本人以外からアクセス可能であってはいけませんし、公開鍵は
信頼の置ける第三者機関によって公開されなければいけません。
公開鍵が無効になれば署名の正当性を証明する手段もなくなります。CA が発行する
公開鍵の証明書には数年程度の有効期限しかないため、現実世界の契約書のような
長期間の管理が必要な文書には使用できません。
電子署名の原理
電子署名の実体は、文書から算出したハッシュ値を公開鍵
暗号で暗号化した数百バイト程度のバイナリデータです。ただし、暗号化に秘密鍵
を使用する点が文書秘匿を目的とした場合と異なります。
署名の検証者は相手の公開鍵でその暗号が解除できるかどうかをもって対応する秘密鍵
が使用された ─ つまりその所有者によって署名が行われたかどうかを検証することが
できます。そして署名から取り出したハッシュ値が文章のハッシュ値と一致していれば、
その署名が行われてから文書に変更がないことを保障できます*1。
電子署名を信頼するには検証に使用する公開鍵が確実に相手のものであることを保障
できなければいけません。また、秘密鍵を管理している側であればコンピュータの
日時を巻き戻した上で改ざんした文書に再署名することも可能であることに注意する
必要があります。
*1 公開鍵
暗号は非常に負荷の高い処理であるため、文書全体を暗号化する代わりにそれから算出
したハッシュ値を使用します。
電子署名の作成と検証
Java で使用できる署名アルゴリズムは
こちら
を参照。
アルゴリズムを指定して秘密鍵で初期化した
Signature
に対して、文書内容のバイナリデータで更新することで電子署名を算出することが
できます。生成される電子署名の実体は数百バイト程度のバイナリデータです。
Java
Signature signature = Signature.getInstance("SHA256withRSA");
signature.initSign(privateKey);
signature.update(binary);
byte[] sign = signature.sign();
検証時は秘密鍵の代わりに公開鍵で初期化します。
Java
Signature signature = Signature.getInstance("SHA256withRSA");
signature.initVerify(publicKey);
signature.update(binary);
boolean valid = signature.verify(sign);
これにより秘密鍵にアクセスできる人間しか署名を行うことができず、署名の検証は
誰でも行うことができるようになります。