クリーム色の背景、色付き表示、高コントラスト、大きな文字のほうが読みやすいですか?配色と文字を選ぶと、すべてのページに一度で反映されます。

無料レッスン

仮名化と匿名化の違い

このレッスンのあとで: 識別子を別の記号に置き換え、まだ人が分かるかどうかを判断できる。

60分のレッスンコマンド9件MySQL と phpMyAdmin のラボ:ショップのデータベースで SQL を練習する

仮名化と匿名化は、同じではない

仮名化とは、名前などの識別子を、別の記号に置き換えることです。匿名化とは、誰のデータか、もう誰にも分からなくすることです。

名前を記号に変えただけで、匿名になったと思う人は多いです。この回では、どこまでやれば匿名と言えるのかを、数字で確かめます。

このレッスンのゴール

メモ

識別子を別の記号に置き換え、まだ人が分かるかどうかを判断できる。

重要な言葉

ことばいみ
仮名化識別子を、別の記号に置き換えること
匿名化誰のデータか、誰にも分からなくすること
ハッシュ値元に戻せないように作る、決まった長さの文字列
ソルトハッシュを作る前に足す、秘密の文字列
再識別置き換えたデータから、誰かを見つけ出すこと

学生が入力するセルは、このプレビューでは空白です。

仮名化は、名前を記号に置き換える

仮名化では、氏名やメールアドレスを、R-001 のような記号に置き換えます。記号と本人を結ぶ対応表は、別の場所にしまいます。

分析をする人は、記号の付いた表だけを見ます。対応表を持っている人だけが、本人に戻せます。

戻せるので、仮名化されたデータは、まだ個人データです。

例: 記号と対応表を分ける

分析用の表記号別に保管する対応表
1行目R-001R-001 は 佐藤 花
2行目R-002R-002 は 鈴木 健
3行目R-003R-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"

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

試す: 組み合わせの人数

コード: sql
-- 地区と生まれた年の組ごとに、何人いるかを数えます。
SELECT ward, birth_year, COUNT(*) AS people
FROM readers
GROUP BY ward, birth_year
ORDER BY people, ward;
-- 全部の行が 1 になります。この組み合わせは、全員を1人ずつ指します。

試す: 区切りを粗くする

コード: sql
-- 生まれた年を、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 に変えると、どうなりますか。

よくある間違い

注意

メールアドレスをハッシュにすれば、匿名になると思いがちです。同じメールは同じ値になるので、別の表の値と照らせば本人が分かります。ハッシュは仮名化の道具です。匿名かどうかは、残った列の組み合わせで決まります。

このラボとソースについて: MySQL と phpMyAdmin のラボ:ショップのデータベースで SQL を練習する

授業で使いますか?このモジュールを学生に割り当てると、教員用ガイド、自動採点つきの課題、学生ごとのラボを使えます。