仮名化と匿名化は、同じではない
仮名化とは、名前などの識別子を、別の記号に置き換えることです。匿名化とは、誰のデータか、もう誰にも分からなくすることです。
名前を記号に変えただけで、匿名になったと思う人は多いです。この回では、どこまでやれば匿名と言えるのかを、数字で確かめます。
このレッスンのゴール
メモ
識別子を別の記号に置き換え、まだ人が分かるかどうかを判断できる。
重要な言葉
| ことば | いみ |
|---|---|
| 仮名化 | 識別子を、別の記号に置き換えること |
| 匿名化 | 誰のデータか、誰にも分からなくすること |
| ハッシュ値 | 元に戻せないように作る、決まった長さの文字列 |
| ソルト | ハッシュを作る前に足す、秘密の文字列 |
| 再識別 | 置き換えたデータから、誰かを見つけ出すこと |
学生が入力するセルは、このプレビューでは空白です。
仮名化は、名前を記号に置き換える
仮名化では、氏名やメールアドレスを、R-001 のような記号に置き換えます。記号と本人を結ぶ対応表は、別の場所にしまいます。
分析をする人は、記号の付いた表だけを見ます。対応表を持っている人だけが、本人に戻せます。
戻せるので、仮名化されたデータは、まだ個人データです。
例: 記号と対応表を分ける
| 分析用の表 | 記号 | 別に保管する対応表 |
|---|---|---|
| 1行目 | R-001 | R-001 は 佐藤 花 |
| 2行目 | R-002 | R-002 は 鈴木 健 |
| 3行目 | R-003 | R-003 は 高橋 愛 |
学生が入力するセルは、このプレビューでは空白です。
ハッシュは同じ入力から同じ値を作る
記号を自分で付ける代わりに、ハッシュ値を使う方法もあります。ハッシュは、入力から決まった長さの文字列を作ります。同じ入力なら、いつも同じ値です。
値から元の入力を計算で戻すことはできません。でも、メールアドレスは推測できます。候補を全部ハッシュして比べれば、元が分かります。
それを防ぐのがソルトです。秘密の文字列を前に足してからハッシュします。
証明書を受け入れる設定
printf '[client]\nssl-verify-server-cert=0\n' > ~/.my.cnfここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
クライアント用の短い名前
alias db='mariadb -h db -u student -pstudent -t -e'ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
ハッシュ値の長さを数える
db "SELECT LENGTH(SHA2('hello', 256)) AS characters"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
同じ入力は同じ値になるか
db "SELECT SHA2('hello', 256) = SHA2('hello', 256) AS same_input, SHA2('hello', 256) = SHA2('hellp', 256) AS one_letter_changed"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
古い写しを捨てる
db "DROP TABLE IF EXISTS student_privacy.people"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
自分のデータベースを作る
db "CREATE DATABASE IF NOT EXISTS student_privacy"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
メールをソルト付きで置き換える
db "CREATE TABLE student_privacy.people AS SELECT id, SHA2(CONCAT('salt-2026-', email), 256) AS token, city, joined_on FROM shop.customers"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
置き換えた表を3行読む
db "SELECT token, city FROM student_privacy.people ORDER BY id LIMIT 3"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
小さなグループは、匿名ではない
名前をすっかり消しても、残った列の組み合わせが珍しければ、人は見つかります。同じ手がかりを持つ人が1人しかいなければ、その人です。
そこで、同じ組み合わせの人が少なくとも何人いるかを調べます。小さなグループは、手がかりを粗くして、大きなグループにまとめ直します。
生まれた年を、10年ごとの区切りにするのが一例です。
例: 手がかりを粗くする
| 手がかり | 同じ組の人数 | 見つかるか |
|---|---|---|
| 北区、1998年生まれ | 1人 | 見つかる |
| 北区、1990年代生まれ | 3人 | 3人の中の誰か |
| 区は消す、1990年代生まれ | 4人 | 4人の中の誰か |
学生が入力するセルは、このプレビューでは空白です。
人数の少ないグループを探す
db "SELECT city, joined_on, COUNT(*) AS people FROM shop.customers GROUP BY city, joined_on HAVING COUNT(*) < 3 ORDER BY city, joined_on LIMIT 5"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
試す: 組み合わせの人数
-- 地区と生まれた年の組ごとに、何人いるかを数えます。
SELECT ward, birth_year, COUNT(*) AS people
FROM readers
GROUP BY ward, birth_year
ORDER BY people, ward;
-- 全部の行が 1 になります。この組み合わせは、全員を1人ずつ指します。
試す: 区切りを粗くする
-- 生まれた年を、10年ごとの区切りにまとめ直します。
SELECT ward, birth_year / 10 * 10 AS decade, COUNT(*) AS people
FROM readers
GROUP BY ward, decade
ORDER BY people, ward, decade;
-- people が 1 の行は残っていますか。10 を 20 に変えると、どうなりますか。
よくある間違い
注意
メールアドレスをハッシュにすれば、匿名になると思いがちです。同じメールは同じ値になるので、別の表の値と照らせば本人が分かります。ハッシュは仮名化の道具です。匿名かどうかは、残った列の組み合わせで決まります。