2019年4月28日日曜日

ウェブ屋さんがネット選挙システムを設計してみたよ

先日、知り合いのお医者さんの誕生ぱーりーに行ってきました。
お医者さん6人+ウェブ屋さん(元手品屋さん)というよくわからない構成です。明らかに場違いです。

わりとワイワイやっていたのですが、みんなお医者さんというだけあって医療保険やら選挙やらちょっと真面目な話も入って、そこから今の選挙は非効率だからネットで投票できればいいのにという流れになりました。

ウェブ屋さんとして意見を求められたので、そこで話したことや、ネット選挙システムの難しいところ、自分が設計するならこうする、といったことをまとめてみました。

ちなみに手品屋さんとしての意見は特に求められませんでした。

要求定義


大前提として、ネット投票をできる人ばかりではないということを頭に入れておく必要があります。

要求定義を書き起こすとこんなかんじでしょうか。

  • インターネット経由で投票(以下オンライン投票)できること
    • お年寄りやカーチャンJ( 'ー`)しでも使えるように、手順はなるべく簡略化し、クリックやタップ数回で投票できる
    • ログインIDとパスワードを発行して…なんて面倒なのでやりたくない
    • あらかじめ定められた期間内にのみ投票できる
  • 従来のように、投票所でも投票(以下オフライン投票)できること
    • ネット環境がある人ばかりではない
  • 白紙投票もできるようにすること
    • 投票したい候補者がいないけど、投票したという証拠は残したい…という人のため
  • 十分な不正対策をすること
    • 同一有権者が2回以上オンライン投票できないのはもちろん、オンライン投票した人がその足で投票所に向かってもオフライン投票できないようにする
    • 同一世帯間でも勝手に投票できないようにすること
  • 障害に強いこと
    • 例えば投票所から投票サーバーにアクセスするような仕様で、ネットワーク障害等でサーバーにアクセスできない場合に投票自体ができなくなると困る
  • 有権者や各自治体への追加負担は最小限に抑えること
    • 例えば有権者がICカードリーダーをもっていないと投票できないとかはNG
    • PC、タブレット、スマートフォンのどれかを持っていれば投票できるようなシステムがいい
  • プライバシーを重視すること
    • 投票は匿名とし、誰が誰に投票したかは記録しない
    • 誰が投票したかは記録してもよい
うーん、色々と厳しい要件が出てきました。どれも大事なことですが、はたして実現できるのでしょうか…

外部仕様

要求定義から外部仕様を作ってみます。

  • 有権者ごとに一意の投票用URLを用意する
    • 他者から推測が困難なランダム文字列をトークンとして含める
    • トークンには有権者情報を含めない(もちろん内部的に紐付けはしておく必要はあるが、トークンを見て有権者がわからないようにしておく)
    • あらかじめ定められた期間のみ有効
  • 投票用URLにアクセスすると、有権者が居住している地区の候補者一覧が表示される
    • もちろんPC・スマートフォン・タブレット対応
    • ページ内に有権者の名前は表示せず、地区のみ表示する(有権者の名前を表示してしまうと、間接的にトークンから有権者情報がわかってしまうため)
    • 「この人に投票する」ボタンをクリック/タップするだけで投票が完了する
      • 「本当にいいですか?」みたいな確認画面は投票する側から見ても面倒だし、ネットになれていない人は確認画面が出た時点で投票が終わったと思う可能性がある
      • 「誰にも投票しない」ボタンで白紙投票
    • 誤タップ対策のために、投票をやり直せるようにする
    • ついでに公約とかもその場で表示できると便利かも
  • 入場整理券は、従来どおり各有権者の家庭に郵便で送付する
    • 投票用URLは入場整理券にQRコードとして印刷しておく
    • トークンも入場整理券に印刷しておく
    • スマートフォンやタブレットからは、QRコードリーダーで読み取るだけで投票用URLにアクセスできる
    • PC用には、入口のURLにアクセスしてからトークンを入力してもらう
  • QRコードおよびトークンは、覗き防止のシール(一度剥がしたら再度貼り付けられないもの)で隠す
    • 家族が勝手に投票してしまわないように
    • トークンは家族の人にも知られないように、各自で管理する
  • 投票所では、係員がQRコードを読み取り、QRコードが印刷された投票用紙を入場整理券と引き換えに有権者に渡す
    • 入場整理券はその場でQRコードとトークンが読み取れないレベルのシュレッダーにかけるか、上から塗りつぶし用の印刷をする(係員がQRコードを使って不正投票できないように)
    • 投票用紙は機械で読み取りやすいよう、マークシート方式にする
    • 投票用紙にQRコードを印刷するのは、オンラインとオフラインで多重投票を防止するため
  • 多重投票があった場合の優先度はオフライン>オンラインとし、オンライン同士、オフライン同士での多重投票に関しては後勝ちとする
    • これに関しては決めの問題なので優先度は違っても構わない
    • 一応の根拠としては、オンライン投票したにもかかわらず投票所まで足を運ぶということは「オンライン投票したもののちゃんと投票できているか不安になり、従来どおりのアナログな投票もしておきたい」という場合があり得るため
    • また、上で書いた誤タップ対策や投票のやり直しを実現するためには後勝ちのほうが合理的
オンラインとオフラインの両方に対応する必要があるので思ったより複雑な仕様になってしまいました。オンラインだけならもっと簡潔な仕様で済むと思います。

内部仕様

いよいよ内部仕様。なんかもう割と面倒くさくなってきていますが、最後までがんばります。
全候補者にIDを割り振ったり、選挙区ごとに候補者や有権者をグルーピングしたりする必要がありますが、そのへんの誰でも思いつくようなレベルの仕様は省略します。

  • 投票された時点で、トークン(≒有権者)と投票相手の紐付け情報を内部的に保持しておく
    • 多重投票対策に必要
    • 先勝ちにせよ後勝ちにせよ、誰が誰に投票したかを記録しておかないと原理的に防げないので
    • その代わり、トークンから有権者情報は(内部のDBを直接参照しない限り)わからないようにしている
  • 投票所ではリアルタイムで中央のサーバーにアクセスしない
    • ネットワーク障害があっても投票を継続できるように、投票作業自体は投票所内で完結させる
    • そもそも僻地などでは十分な回線速度を確保できない場合もあるため
    • 各投票所ごとに集計結果を保存しておく
  • 定期的に、あるいは投票期間が終わった後で、非同期で中央サーバーに集計結果を送信する
  • 選挙期間が終わり、集計が完了したらトークンと投票相手の紐付け情報を完全に削除する

これでだいたいカバーできたんじゃないかな…と思います。

対人が面倒

何気に面倒なのが対人対策です。

職場の上司や家族に特定の政党の熱狂的な支持者がいて、「今からこのPCを使ってこの人に投票せよ」と言われた場合でも波風立てずに対応できなければいけません。

従来の投票所での投票はそのへんは何も問題なく、「はい、投票しましたよー」と言ってシレッと別の人に投票してしまえますし、証拠が残らないのでそれ以上調べようもありません。

ネット投票では完璧な対策が難しいですね。

  • 「もう投票しちゃいました。整理券も処分しちゃいました」と言う
    • 「仕方ねーな。次回はちゃんとここで投票しろよ」と言われるかも?
  • とりあえず言われるままに投票して、後で投票所でも投票する
    • オフライン投票が優先されるので、投票結果が上書きされる
    • オンライン投票後に「よし、この整理券は預かっておく」と言われたら困る

まあそもそも法に触れる可能性が高いわけですが、匿名でチクったとしてもブチ切れて犯人探しに躍起になる可能性がありますし、できることなら波風立てずにやり過ごしたいですよね。

そんな会社辞めちまえ」なんて言わないこと。「政治が絡むと厄介だけど、それ以外は本当にいい人だし同僚との人間関係も良好」っていう場合もあるんですから。

家族間の場合はもっと厄介で、覗き防止のシールがあるので勝手に投票されたかどうかはわかりますが、「投票しといたよ」と居直られたら困るわけです。

あとこういうことやる人たちって、だいたい本人は善意のつもりなんですよね…

まとめ

オンラインが絡むと、権力のある人が特定の政党や候補者の熱狂的な支持者だった…という場合の完璧な対策は極めて困難です。

対人対策の必要がなければ、つまり人間関係が良好で不正利用する人がいないという前提であればあまり難しくありません。

ネット選挙を考えるなら、ある程度割り切らないとダメみたいです。

このアイデアパクっていいですよ!!!>えらい人

おまけ

はぴば!

0 件のコメント:

コメントを投稿