一致したキーがあるときに、その接触日を知る方法
9/25追記 厚生労働省Q&A 問④-7 広範な接触情報について
cocoa 1.1.4 リリースに際して明らかになったこと
cocoa 1.1.3 までは、「接触チェックの記録」の「一致したキーの数」に1以上の数字があるとき、1メートル以内で15分以上という判定基準よりも広範な、OSが検知したすべての陽性者との接触情報を表示していたことが明らかになったそうです。
判定基準内の陽性者との接触があったとき、接触確認アプリが正常に接触を表示していたのか、それとも、表示していなかったのかは、明らかにされませんでした。android版の接触確認アプリcocoaが、判定基準より広範な接触を表示していたか否かも、明らかにされませんでした。
厚生労働省への感謝
厚生労働省殿が真摯にアプリをより良くしていくためにお取り組み頂いておりますことには、ソースコードを公開していただいていることを含めて、大変に感謝しております。引き続きご対応をお願い申し上げます。
ところで、鈴木健治が、接触日を知りたい100名からヒアリングをしてきた際には、AndroidとiPhoneの2台持ちで、Android版の接触確認アプリCOCOAでは接触あり、iPhone版では接触なし、iPhoneのOSの「接触チェックの記録」の「一致したキーの数」が1という方もいらっしゃいました。
「広範な接触」には、「接触ありと表示すべきであった接触」も、含まれていたのかなと、私としては解釈しております。
iPhoneユーザーさんは、iOS 14へのアップデートと、接触確認アプリCOCOA1.1.4へのアップデートしないと、OSで一致したキーの数が1となっても、公費でのPCR検査は望めない方向と思われます。
広範の具体的内容
「1メートル以内で15分以上という判定基準よりも広範」の「広範」は、スマホのBluetoothの信号を使って距離を測定する技術からすると、可能性としては10mぐらいも有り得ますが、3mぐらいかと思われます。3mや10mが、判定基準である1mよりも広範ということです。
15分以上という、時間の方の判定基準に関するソースコードのパラメーターは、1.1.4で変更されておりませんし、15分という判定基準より広く、例えば5分でも接触として検出していた可能性というのは、低いと信じたいです。
3mで広範というのは、例えば、あるイベントでQRコードを読み取って、その会場で陽性者さんがでたらお知らせする仕組みと比較して、陽性者さんとの距離はとても近いです。ただ、よほど大きい声で会話するなどでなければ、感染リスクは低いのかと思われます。
感染リスクについて、100名相談では、鉄道の車内、駐車場(車中で休憩や食事)、コンビニ、ドラッグストア、スーパーのレジ、隣の部屋かな?、屋外スポーツ、などが唯一の心当たりで、かつ、検査なさった方はみなさん陰性でした。
接触日シート及び別冊の更新について
しかし、体調が優れなかったり、無症状だけれどもご高齢の方などリスクの高い方と会う予定がある方で、自己責任で、「一致したキーの数」を使って「判定基準より広範な接触」が検出された際に、その接触日をお知りになりたいニーズはまだあろうかと思われます。
このため、このボランティアでの接触日シート及び別冊の更新を、もうしばらく続けます。
厚生労働省Q&A Q4-7
9/25追記 ここまで
1. このページの目的
対象
iPhoneやiPad (iOS) で、接触したと通知されたり、一致したキーの数が1なのに、接触確認アプリCOCOAで接触日が表示されない人
提供する情報
接触した候補の日を調べる方法や考え方へのアクセス
接触候補日をすぐ確認したい方は、こちらの接触日シートに移動してください。
https://docs.google.com/spreadsheets/d/16ZrHDBJXTgg0eKfIQbr-d4BwkgTbV4-5MG6BcyU7d_Q/edit?usp=sharing
ハッシュ値から接触候補日を探すページ(接触日シート別冊)もつくりました。
・解説ページ
ハッシュ(HASH)値から接触日を調べる方法
・実際に調べるページ
接触日シート別冊
・iOS 14、接触確認アプリ1.1.4に更新した後の照合については、アプリで接触日が表示される可能性があります。バージョンアップをおすすめします(9/25にiOS 13.7→14、接触確認アプリ1.1.3→1.1.4に修正)。
本ページを提供する期間
・iOS版の接触確認アプリでこの不具合が解消したり、公式認定の対応アプリが別途提供されたことを把握した場合、それらへのリンクをまず紹介する修正をします。
・本文書を提供する鈴木健治の判断で、このページの内容を修正、削除、更新停止等する可能性がありますが、いかなる主体によるものであっても、要望・忖度・配慮・指示等により本ページを削除しまた修正に同意する可能性は一切ありません。日本国憲法や著作権法をまずご参照ください。
2. iOSで「一致したキーの数」が1以上
“MatchCount” : 1,
iPhoneで出力できる [ExposureChecks-2020-MM-DD.json] というファイルを、iOSのメモやメール添付してみて開いてみると、このjsonファイルのなかの [MatchCount] が1だったり0だったりします。
0は接触なし、1は接触ありです。
(この.jsonのファイルは、「接触チェックの記録」画面の「接触チェックの記録を書き出す」をタップすると出力できます。)
一致したキーの数 1 しかしアプリでは接触なし
MatchCountが1だと、「チェックの詳細」画面で[一致したキーの数]に1とでます。このチェックは、接触確認アプリCOCOAからリクエストに応じて、iOS(のヘルスケアあたり)が計算しています。
しかし、iOSの接触確認アプリCOCOAでは、接触なし(陽性者との接触は確認されませんでした)がでます。
3. 接触確認アプリの不具合
一致したキーの数が1で接触あり、接触確認アプリでは接触なしのとき、どちらが正しいのでしょうか。厚生労働省のQ&Aや、厚生労働省の窓口にメールで問い合わせた方によると、一致したキーの数が1の日があれば、濃厚接触した可能性があるとして行動して欲しい、ということのようです。
つまり、一致したキーの数が1以上のときは、接触あり、です(2020年8月)。
(Androidは、アプリで接触ありと正常表示されるようになりました。2020年8月12日更新の厚生労働省Q&A,問21, 問22, 問23)
4. 接触日がわからないと困ること
接触者にとって
・自分のどの行動が、感染の可能性のある接触(1m以内15分以上)だったというのか、ふり返ることができない。
・本来の健康観察期間が、いつ終わるのか特定できない。
・接触した可能性がある人に連絡しようにも、14日全部では多人数になりすぎる。
・今後の予定で、他者に感染させるリスクを判断できず、不安である。
・自分のスマホ操作が間違えているのか、それとも、アプリやOSの不具合なのか、調べる時間をとられる。
陽性登録者にとって
・自分が感染させた可能性の接触が14倍に広がって、不必要に責められる可能性がある。
・例えば、陽性を所属組織に報告したあと、一緒の会議やイベントに参加した相手に接触通知があったとき、相手の接触日が会議日・イベント日でないとわかれば、本当は感染させる接触ではないこと(自分が感染源でないこと)が確定するのに、相手の接触日がわからないことで、自分が感染源と疑われてしまう。
・陽性登録をしてもアプリで接触が表示されない。
5. 接触日の候補を調べる方法
陽性者の接触を特定するキーは、接触日ごとにまとめて配信されている
・2020年8月時点では、陽性者のキーは接触日ごとに1つのzipファイルにまとめられています。
・陽性者のキーの [rolling_start_interval_number ] の値は、仕様上、接触した日です(鈴木健治の仕様・コード等の読み込みによる)。
・zipファイルの番号を特定できれば、接触日(の候補日、非公式)を推定できます。
zip番号→接触候補日(非公式)を特定する方法
・接触日を特定したいと、相談してくださる方たちと、色々試行錯誤をしてきました。
・私が毎日データをみて、データの正常・異常を自分なりに判断して、確認したzip番号、提供されたキーの数、接触候補日(非公式)の組み合わせをシート(接触日シート)にしています。
https://docs.google.com/spreadsheets/d/16ZrHDBJXTgg0eKfIQbr-d4BwkgTbV4-5MG6BcyU7d_Q/edit?usp=sharing
・この接触日シートのnewシートを使って接触候補日(非公式)を推定してます。
・接触日シートでは、今までダイレクトメール(DM)等で相談してくれた方の事例を、本人のご承諾のもとで、匿名で公開しています。
・接触候補日は違和感がないか相談し、他の日では無くこの日だろうという感触をつかめてます。ただ、接触日8/7については、システム側の不具合かという事例が2件ありました。8/20もデータ側が確実か確信もてない事例がありました。
・最新の方法は、上記シートで随時更新していますので、ご参照ください。
・TwitterのDMで接触日を調べるご相談も、個人的に可能な範囲で受け付けています。ご相談では、ExposureChecks-2020-MM-DD.jsonを送っていただいてます。色々分からなければ、接触日シートを軽くみていただいて、DMください。ご相談窓口はTwitterに限定させて頂いてます。匿名のダミーのアカウントでかまいません。
・接触候補日を知りたいかたは、上記のURLからシートを参照して、ご連絡いただくか、ご自身で確認してみてください。
TEK表をつくるために使っているツールや情報
次のツールを使っています。ありがとうございます。
・Google スプレッドシート(表計算のWebアプリ)
・rocazさん https://twitter.com/rocaz の [probeCOCOATek] TEKをダウンロードして読みやすくするツールです。
https://github.com/rocaz/probeCOCOATek
・各種ドキュメント、公開されたソースコード(Google, Apple, 米、独(corona-warm-app)、日本等)
・twitter #COCOAボランティアデバッグ のタグで各位から公開していただいている情報
情報源について
各種情報源については、Twitterにて書き散らかしております。
twitter検索機能をご活用いただき、下記にさらに知りたいキーワードなど追記して、検索してください。
https://twitter.com/search?q=from:@info_kvaluation
基本的な情報は以上です。
一致がでたかた、びっくりですよね。なんか分からないけれど接触日の候補がしりたければ、連絡してください。
以下、経緯やその他の不具合、お問い合わせへの内容、公的機関やエンジニア向けの情報を追記します。
6. (参考)いままで試行錯誤等
・提供されたキーの数(RandomIDCount :数; Keys:(Count:[数]), Android表示では1日分合計されて「キーの数」)は、1つのzipファイルに含まれる陽性者のキーの数です。「提供キー」と略します。
・一致がでたときの提供キー数と同じ提供キー数となっている行を探し、そのzip番号を特定します。zip番号と接触候補日(非公式)が対応します。zip番号が複数みつかれば、それらを全部、接触の候補日と推定します(8/17ごろ)。
・もう少し候補を絞るために、サーバーからTEKを受信した日時(タイムスタンプ)と、サーバーの配信日時で対象を狭めます(8/17ごろ)。
・一致がでたときのタイムスタンプと、この一致のタイムスタンプの前後のタイムスタンプの提供キーの数を調べます。iOSの「接触チェックの記録」画面で、提供キーの数の並び順を確認(メモ)してもらって、提供キーの数の並び順から、接触日シートでの同じ並び順を探して、zip番号を特定します(8/17-8/19ごろ)
・半自動化して、毎晩0:30ごろ接触日シートを更新し、仕掛けを把握しやすい方は自分で接触候補日を見つけます(8/19-)。
・お問い合わせの相談者様には「接触チェックの記録」画面の一番下の方にある「接触チェックの記録を書き出す」から ExposureChecks-2020-MM-DD.json を出力してもらう。そのjsonのファイルを、相談者さまから鈴木宛に送ってもらい、鈴木が内容を確認する(8/19-)。
・iOSではハッシュ値とzip番号が対応してるから、ハッシュ値を再現できれば並び順を調べなくても、ハッシュ値からzip番号、さらに接触候補日(非公式)を特定できることを示唆(8/17)しつつ、ハッシュ値関係の対応は未定。簡易的にzip番号の並び順でハッシュを表示しておくことも検討中(8/23)。
・その後のことは、接触日シートをご参照ください。
7. その他の課題
一致がでても通知されない。
・陽性者との接触と判定されても、接触確認アプリCOCOAに表示されないばかりでなく、iOSからの通知もされない事例が報告されています。
→毎朝、接触チェックの記録画面で、タイムスタンプをタップして、一致したキーの数が0であることを確認すると良いです。
・タイムスタンプの量があって大変でしたら、一度、ExposureChecks-2020-MM-DD.json を出力して、 “MatchCount” :, を次々検索して全部0であることを確認します。1以上は陽性者との接触ありです。
・次の日からは、新しい13から15ぐらいのタイムスタンプをチェックすれば大丈夫です。
iOS で照合結果が14日保存されず早く消去される
・接触チェックの記録画面(ExposureChecks-2020-MM-DD.json)から、14日を待たずに、7日後ぐらいに照合結果が削除される事例が報告されています。
・10日前の照合結果に気づかずそのまま削除されてしまう可能性があるので、毎日、できれば5日に1回ぐらいは一致したキーの数のチェックすると良いです。
8. 接触確認のキーワードと仕組み
8.1 キーとはなにか
RPIと、TEKがあります。
8.2 [RPI] すれ違い時に、すれ違った人の端末から受信するキー
・RPI (Rotating Proximity Identifiers, 接触符号[仕様書]、ランダムな識別子[厚生労働省Webサイト])
・自分のスマホに記録されます。
・自分を示すキーではなく、接触した人の端末を示すキーです。
・機種変更したとき、新スマホに自動でコピーされるかどうかは分かりません。ユーザーがコピーする方法はありません。14日間ぐらい、旧端末をwifiに接続して確認するのが安全と思います。
・仕様では、10分から20分に一度ずつ新しいキーになります。
8.3 [TEK] 陽性者登録後に、サーバーからダウンロードするキー
・TEK (Temporary Exposure Key, 日次キー[仕様書]、日次鍵[厚生労働省PDF])
・陽性者が保健所から通知された処理番号を使って陽性登録すると、サーバーに登録されるキーです。
・陽性登録の次の日付けの0時ごろ、サーバーに登録されて、順次スマホに送信されます。自動送信でダウンロードしている場合と、接触確認アプリを立ち上げないとダウンロードしない場合とがあります。
・1日に1つのTEKが作られます。
8.4 照合の考え方
考え方としては、
自分のスマホに記録された [ RPI ] (すれ違い接触をした人)の記録と、
サーバーからダウンロードした [ TEK ] をすべて照合して、
一致がでれば、すれ違ったすべての端末の中に、陽性者の端末もありました。
8.5 照合の仕方
自分のスマホのRPIsと、サーバーからダウンロードしたTEKはフォーマットが違うので、直接比較できません。
直接比較できたら、街中にBluetooth受信機を設置しておけば、そこを通った人に、濃厚接触が通知されたかどうか、無関係な第三者が把握できることになってしまいます。
Apple | Google の仕組みは、すれ違いのときのRPIと、サーバーから送信する陽性者のTEK、それぞれは、誰でも読み取れるコードとするが、TEKからRPIを計算するところを秘密にしています。
そして、照合は、一人ひとりの端末内部で行い、サーバーや、Apple, Googleでは把握できません。公衆衛生当局も把握できません。
このようにプライバシーに最大限配慮することで、使ってくれる人を増やそうという、現状、最善の方法の一つと考えられます。
陽性者が登録する診断キー(Diagnosis Key)には、TEKからRPIを計算するための暗号化された秘密情報が含まれています。
8.6 接触日の推定方法
一致があったことがわかれば、一致したTEKに記載されている接触した日( [rolling_start_interval_number ] ,そのTEKを使ってRPIの生成を始めた日時)を読み出せます。
2020年8月の日本の運用では、たまたま、接触した日が同じTEKを1つのzipファイルにまとめています(条件1)。
そして、たまたま、iOSでは、zipファイル毎にタイムスタンプを表示しています(条件2)。
この条件1と、条件2が成立していると、zipファイルの特定によって、接触日を特定できます。
(もし、zipファイルにあるTEKが異なる接触日のものであれば、両方の接触日が候補になります)
9. 仕様v1.0
対象
エンジニアの皆様。ご活動ありがとうございます。
この文書に記載された手法を使って、接触候補日を推定したり、表示したりするWebページやスマホアプリ、ショートカット、Excelファイルなどを自分も作って自分の名前で公開したい、という方へのお願いがあります。
次の仕様を満たすことを要望します。
1. zipファイル1つごとに、キーの数だけ含まれている [rolling_start_interval_number ] の値を、全てチェックし、同一であることを確認する。
同一ではない場合
1.1 エラーをだし、接触候補日を表示しない。
1.2 含まれている複数の全ての日付を接触候補日(非公式)として表示する。
2. Exposurecheckの全体をチェックしていない場合、他にも一致日がある可能性を仕様上の注意として、または結果表示に際して明確にユーザーに伝達する。
3. rolling_start_interval_number の日付けが将来となるなど(zip番号:865, 866, 867, 868 そして 869など)異常がある際には、一致したという判定が間違っている可能性を表示する。
4. (可能であれば)キーの重複をチェックし、重複発見時には一致したという判定が間違っている可能性を表示する。
5. 一致するキーの数が1となった方の個人情報を保護することを、重ねてお願いします。
6. export.bin (zipファイル)のデータについて不具合が発見されると、 Twitterで、#COCOAボランティアデバッグ のタグ付きで情報発信がなされていますので、適宜ご参照ください。
アプリ等のご制作者殿
上記仕様を満たして頂き、テスト結果や該当するソースコードのスクショなど拝見させていただき、鈴木健治が安心できた場合、そのアプリ等につき、制作者や関連企業殿が、有償・無償、商用・ボランティアを問わず提供する際には、希望があれば、推奨させていただきます。推奨する際には、次の7をお願いしたいです。
7. (お願いですが)ユーザー様に、鈴木健治が不定期に実施するアンケート協力して欲しい旨を、何らかの手法で伝えるためのアクションをする。
鈴木健治は、一般的に、接触確認に関するその他のアプリやWebサービスについて、信頼したり、推奨したりすることはありません(全面的な本当のOSSを除く)。
10. 保健所、厚生労働省等、公衆衛生当局様
1. 可能な限りご協力致しますので必要ありましたらご連絡ください。
2. 私に接触候補日(非公式)についてお問い合わせくださった方へは、数枚のスクショを示して、「アプリが正常に動作していたら、○月○日を接触日として表示したであろうと、推定します」とお伝えしています。
3.本文書にある、上記のような論理を積み重ねての推定ですので、接触候補日(非公式)は、接触があっただろう日として尊重頂ければ幸いです。
4. また、アプリの不具合解消前に、公的に、接触候補日を示すWebページなどご作成いただけるのでしたら、ぜひご作成ください。私は受注しませんが、協力はします。
11. 著作権表示
本文書及び公開している接触日シートの著作権及び著作者人格権は鈴木健治が保持しております。
12. twitterやそのDMで対話してくださった全ての皆様に感謝します。
Copyright 2020, Kenji Suzuki
2020年8月23日執筆
8/23リンク切れを修正
9/15接触日シート別冊へのリンクと、解説ページへのリンク、iOS13.7へのバージョンアップのすすめを追加。
9/25厚労省QA 4-7に対応。