2020年11月14日

公開鍵認証を実現する上での注意点

公開鍵認証は「デジタル署名を作れるのが秘密鍵を持つ本人のみ」という理屈の認証方式だけど、では署名だけ実装すれば実現できるかというと、そう簡単ではないという話。
7
angel as ㌵㌤の猫 @angel_p_57

公開鍵認証って、一般ユーザから見ればこの程度の理解で十分なんだけど。ただ、それを実装する側で気を付けることって意外と難しいのかも。 pic.twitter.com/cCQ8WGWUHI

2020-11-07 02:06:10
拡大

ユーザに紐づいた公開鍵で署名検証できるところまで実装して、それで「認証できます!」で終わりにすると危ないですよ、という話。

angel as ㌵㌤の猫 @angel_p_57

公開鍵認証に相当するもので私が把握している限りだと、SSL/TLSのクライアント証明書によるクライアント認証、SSHの公開鍵認証、FIDO2/WebAuthnによる署名を利用した認証。他に有名どころって無い気がする。

2020-11-07 02:09:14
angel as ㌵㌤の猫 @angel_p_57

で、前2つが確立したのが90年代中~後半? だから、20年以上前からあって、マネするものが出ない技術ということ。あ、IPSecとかOpenVPNとか、そういうところもあるか。ま、でも、大体似たようなものよね。

2020-11-07 02:12:23

後日、なんで署名だけだとマズいのか。連ツイした内容。

angel as ㌵㌤の猫 @angel_p_57

ちょっとこの話題に関してつらつら書いてみるか。 twitter.com/angel_p_57/sta…

2020-11-14 22:37:51
angel as ㌵㌤の猫 @angel_p_57

この話の続きとして。公開鍵認証相当の実装は世の中そんなに多くない。 それには、(デジタル)署名を認証に使う場合の制約が意外に強烈だからというところがある。

2020-11-14 22:38:31
angel as ㌵㌤の猫 @angel_p_57

先に署名についておさらいだけど、これは現実世界の「印鑑」に喩えて全く問題ない。 喩えで話をすることに不安を感じる人も多いと思うけど、そもそも名称が「署名」なんだから同じ特性を実現しているもの。 逆に喩えでも理解できないんだったら、具体的なデータの流れ見てもどうしようもないと思う。

2020-11-14 22:40:07
angel as ㌵㌤の猫 @angel_p_57

その特性としては、「はんこの持ち主しか押印できない (秘密鍵の持ち主しか署名できない)」 「印影を知っていれば押印が本物と判断できる (公開鍵を受け取っていれば署名を検証できる)」 「印影からはんこを偽造するのが困難 (公開鍵や署名から秘密鍵を解析するのが困難)」

2020-11-14 22:40:58
angel as ㌵㌤の猫 @angel_p_57

今の技術なら、はんこの偽造はもうそんなに困難ではないだろうけど。一応、特性を考える上ではそういう前提で。

2020-11-14 22:41:23
angel as ㌵㌤の猫 @angel_p_57

印鑑と署名で大きく違うとすれば、印鑑は「押印でできた印影が文書(紙)と切り離せない(だから印影は共通で良い)」 のに対し、署名は「署名対象のデータ(被署名データ)と署名データは分離可能(だからデータ毎に署名も変わる)」くらい。

2020-11-14 22:41:56
angel as ㌵㌤の猫 @angel_p_57

で、話を戻して。署名を認証に使うにあたって、元のイメージ図では踏み込んでないところだけど、 「署名対象のデータはなに?」というところが実はめちゃくちゃ大きい問題になる。 署名が本物かどうか検証にするにしても、署名対象のデータと突き合わせないとやりようがないし。

2020-11-14 22:42:37
angel as ㌵㌤の猫 @angel_p_57

このデータ、適当に決めるわけには行かない。 現実で想像してほしいんだけど、社長印押した何かの契約書持ってきた人って社長本人ですか? って言われたら、 そんなわけないだろうと気付くと思う。

2020-11-14 22:43:24
angel as ㌵㌤の猫 @angel_p_57

あくまで社長印の効力は、「その契約書の内容に社長が同意していることの保証」でしかなくて、 その契約書を持ってくる人や、(結構「署名」だと誤解されがちだけど)契約書を作った人が社長だってことは保証しない。

2020-11-14 22:43:59
angel as ㌵㌤の猫 @angel_p_57

では、署名/印鑑を認証、つまり「それが誰なのか証明する」ために使うには、「当人が勝手に用意したデータ/文書」ではダメで、判定する人が同意したものでないといけない。

2020-11-14 22:44:39
angel as ㌵㌤の猫 @angel_p_57

簡単に言うと、「あなたが社長さん? じゃ、今この文書に押印できますよね? 押印確認できたら本人と認めますよ」と、そういうことになる。予め押印した文書を持ってくるのではなく「その場で」押印できるのが本人証明になるということ。

2020-11-14 22:45:15
angel as ㌵㌤の猫 @angel_p_57

ここまで聞いたところで、先回りして「あ、じゃあチャレンジ・レスポンスなのね、オーケー、オーケー」と考える人もいるかもしれない。 しかしそれは甘い。ことはそう単純ではない。

2020-11-14 22:45:47
angel as ㌵㌤の猫 @angel_p_57

凄く単純な例として、「今この文書に押印できますよね? 『100万円XXに譲ります』って文書なんですけど」って文書出されてホイホイ押印してたら、そりゃ本人と認めてくれるかもしれないけど問題になる。このことは分かると思う。

2020-11-14 22:46:48
angel as ㌵㌤の猫 @angel_p_57

この問題自体はまあ、契約書類用のはんこと本人確認用のはんこは別です、とか。ちょうどマイナンバーカードに入っている署名用の鍵に2種類あるのと似たような対処で、なんとかなるかも知れない。しかし、「都合の良い文書に押印させられる」という問題は依然として厄介。

2020-11-14 22:47:56
angel as ㌵㌤の猫 @angel_p_57

ここでやっと本題になる。つまり、認証を判定する側に悪意や過失があった場合、提出した押印文書(署名)が流用されたらどうなるか。その対処を考えなければならない、ということだ。

2020-11-14 22:48:26
angel as ㌵㌤の猫 @angel_p_57

「いや、流用させなきゃいいんでしょ。判定するのは信用ある人(サーバ)達だし問題ないよ」と言い切れるんであれば、話は終わる。ただ、そう仮定するなら端から署名なんて使う必要ない。共通のパスワードを使って照合するだけで済むからだ。相手を信用する(相手と心中する)のであれば。

2020-11-14 22:49:12
angel as ㌵㌤の猫 @angel_p_57

パスワードよりもセキュアな認証として、ってのがあるわけだから、「署名なんて使う必要ない」だと何やってんだか分からない。

2020-11-14 22:49:51
angel as ㌵㌤の猫 @angel_p_57

話を戻して、実際の悪用のイメージとしては次のようになる。Aが悪意のあるサービスBを利用しようとし、他サービスCへなりすましされる例。

2020-11-14 22:50:22
angel as ㌵㌤の猫 @angel_p_57

1. A→B認証手続き開始 2. 直後にB→C(Aとして)認証手続き開始 3. Cが押印対象の文書 d をBに提示 4. Bが同一のdをAに提示 5. Aがdに押印しBに提示 6. BがAから得た押印済みdをCに提示 → なりすまし成立

2020-11-14 22:51:13
残りを読む(16)

コメント

コメントがまだありません。感想を最初に伝えてみませんか?