プロフェッショナルSSL/TLSを読む
を数年前にそこそこがっつり読んで、今読み返したらほとんど忘れていたので復習する。
まず署名って何だっけというところから。真正性 authenticity と完全性 integrity を担保するもの。つまりその情報がその発信者にしか作れなくて、かつ改ざんされていないことを判別できる仕組みという認識。で、これをどうやってるんだっけ。
npm installとかでhashをチェックしている時にintegrityと出るのは完全性を確認していたんだな。やってることはわかっていたけど、integrityって完全性って意味だったんだという。
そう、で、ハッシュ値はデータの完全性を判別できるけど、データと分離した状態で通信してしまうとデータとハッシュを両方改ざんされた時に気付けないのはどうするか、というところが毎回気になっていた(で、毎回なあなあにしていた)。
MAC(Message Authentication Code)を使うとその解消が可能らしいけどどうやるのか。鍵を使ったハッシュ値を使うらしい。で、その鍵は事前に共有しておく必要があると。この鍵の共有はどうやるんだろう。ただ、鍵を共有できていれば、少なくとも真正性は判別できそうだ。
具体的なMACについては https://en.wikipedia.org/wiki/Message_authentication_code を読んでおこう。
あれ、この場合の完全性って何だ。メッセージが改ざんされていないことか。
単純に考えればハッシュで判別できそうだが、それだと攻撃者がメッセージとハッシュ両方をすり替えることでメッセージを改ざんできてしまう。で、それだと完全性が判別できないことになる。そのメッセージとハッシュを鍵付きで行うことで真正性の担保と完全性の担保を同時にやっている、ということか。
これがもし攻撃者が単純なリプライ攻撃をしたとしても、メッセージ自体は送信者が送ったものと同じだから、この場合も完全性は保たれているということになるのかな。ただ真正性はどうなるんだろう。
まぁ別に、直接発信者から来ようが攻撃者を経由していようが、ネットワークの海に一度は溶けたメッセージだというのは同じなので、経路は別に関係ないのか。真正性も経路云々は無視して発信者が送ったものと同じものが届けばいいということなのかな。
公開鍵暗号化方式については大丈夫だと思う。
拡張子の違いで混乱するので、証明書まわりのデータフォーマットについておさらいしよう。大体 https://en.wikipedia.org/wiki/X.509#Certificate_filename_extensions に書かれてた。
- der(Distinguished Encoding Rules): 構造化データのフォーマット、ASN.1 を利用している
- pem(Privacy-enhanced Electronic Mail): base64エンコードされたder
- cer, crt, der: バイナリのderを指すらしい
なのでbase64エンコードされている場合は .pem
になって、バイナリの場合は .crt
とかになる。