店にお願いするのは掲示物を貼ることだけ、と決めた瞬間に、難しい問題が一つ残った。貼ってあるだけの札は、誰でも撮れる。撮った写真は、そのまま人に送れる。店に行かずに印が入る道が、設計上いちばん最初から開いている。ここをどう扱うかが、この仕組みの一番の勘所だった。
手で組み立てられない札にする
まず、札に焼く文字列を推測できないようにした。中身は、店の番号と、その店の札の版と、百二十八ビットの乱数の三つ。これを鍵付きのハッシュで束ねた署名を付けてある。受け取った側は同じ計算をやり直して一致を見る。だから、ある店の札を一枚手に入れて、番号だけを一つ増やした文字列を作っても通らない。乱数と署名がそろわないからだ。百二十店ぶんの札は、一枚ずつ独立している。
そのうえで、公開している問い合わせ口からは、札の版を返さないようにした。版は札を組み立てる材料の一つで、外から読めると手がかりになる。運営の画面でしか見えなくても、運用上は何も困らなかった。
刷り直しは、一枚から
版を持たせた本当の狙いは、失効させられることだった。ある店の札の写真が出回っていると分かったとき、その店の版を一つ上げる。すると、その店の古い札は即座に通らなくなる。刷り直すのはその一店ぶんだけで、他の百十九店は貼ったままでいい。全部を一斉に刷り直す運用は、費用でも手間でも現実的ではないので、店単位で切れることを先に用意しておく必要があった。
読んだあとにも、短い関門を置く
札を読んで印が入るまでのあいだにも、一つ挟んだ。読み取りを受け付けた時点で、その人とその店に紐づいた使い捨ての受付情報を発行し、有効期限を九十秒にした。使えるのは一回だけで、期限が切れたものも、別の人が持ってきたものも弾く。これがあると、読み取りの記録だけを他人に横流しする経路が閉じる。
もう一つ、同じ受付を二回送っても印が二つ入らないようにした。電波の悪い店先では、送信が途中で切れて利用者がもう一度押す、という状況が普通に起きる。人の操作の揺れを不正と区別できないなら、二重に処理しないほうを既定にするほうが安全だった。
防げないものを、防げると書かない
それでも、印刷した札の共有は技術的に完全には防げない。これははっきりしている。位置情報を取らないと決めた以上、その人が本当に店の前にいるかを機械で確かめる手段は残っていない。ここで「万全の不正対策」と書いてしまうこともできたが、書かなかった。提案書には、これは残ってしまうリスクだと明記し、検知と保留と失効の運用で下げる、という形で出した。
守れない約束を先に書くと、実際に共有が起きた日に、仕組みではなく信用のほうが壊れる。技術で消せるリスクと、運用で薄めるしかないリスクは、最初から分けて相手に渡しておくべきだと思う。
一度も、居場所を聞かない
導線も工夫した。札に焼くのは、メッセージアプリの中で開く形式の住所にしてある。アプリ内蔵の読み取り機で読むと、読んだ瞬間に参加者の画面が開く。素の住所を焼くと、読み取り結果がただのリンクとして表示され、利用者が一度タップしないと進まない。店先での一手間は、そのまま離脱になる。しかもこの経路は、最初から最後まで一度も居場所を尋ねない。
次の回は、その札を実際に刷ってみたら読めなかった、という話を書く。