Google スプレッドシートでメールアドレスを正しくハッシュ化する

8appsチーム·

メールのハッシュ化が失敗する原因は、大文字小文字、見えない空白、Gmailのドット規則であって、ハッシュではありません。実際に一致させる正規化の順序。

ハッシュは問題ありません。問題は入力です。

John@Example.com、john@example.com、john@example.com (末尾に空白)は、1つのメールボックスであり、3つのまったく異なるSHA-256ダイジェストです。メールのマッチ失敗はどれもこうした瞬間にさかのぼります。ですからこのページの大半は、ハッシュ化の直前の3秒についての話です。

共通の処理:トリムしてから小文字化

土台については主要2社の見解が一致しています。Meta: "Trim any leading and trailing spaces. Convert all characters to lowercase." Google Ads: 小文字化し、空白を除去。Google スプレッドシートでは:

=LOWER(TRIM(A2))

この数式をすり抜ける罠が2つあります。

  • ノーブレークスペース。 TRIM() は CHAR(160) を除去しません。CSVエクスポートやコピー&ペーストが仕込む、あの見えない文字です。見た目はきれいなセルが誤ったダイジェストを出すなら、まず =SUBSTITUTE(A2, CHAR(160), "") を。
  • リッチテキスト由来の不可視文字。 メールクライアントから貼り付けたアドレスは、ゼロ幅文字を連れてくることがあります。期待値との長さ比較(=LEN(A2))が最も安価な検出手段です。

分岐点:Gmailのドットとプラス記号

ここでプラットフォームの規定は実際に異なります。一方のルールをもう一方に写すとデータが壊れます。

  • Google Ads は gmail.com と googlemail.com のアドレスに限って追加のクリーンアップを明記しています。ユーザー名部分のドットを除去し、+ 以降をすべて除去する。Jane.Doe+Shopping@googlemail.com → janedoe@googlemail.com。これを他のドメインに適用するのは誤りです。多くのメールシステムではドットに意味があり、Googleのルールもこの2ドメインだけを名指ししています。
  • Meta はドットやプラスに関するルールをいっさい明記していません。トリムと小文字化が、明記された指示のすべてです。

したがってGmailアドレスの多いリストにはメール列が2つ必要です――Google向けに正規化したものと、Meta向けに正規化したもの。電話番号とまったく同じです(その話は電話番号ハッシュ化のガイドにあります)。

そしてハッシュ化し、一度だけ証明する

SHA-256、小文字の16進出力――Metaのドキュメントは小文字16進を明示しています。Google スプレッドシートには組み込みのハッシュ関数がなく(Googleの関数リストに暗号関連のものは一切ありません)、ダイジェストはApps Scriptかアドオンから得ることになります。どちらを使うにせよ、パイプラインを一度だけ証明してください。Metaは john_smith@gmail.com の期待ダイジェストを公開しています――

62a14e44f765419d10fea99367361a727c12365e2520f32218d505ed9aa0f62f

――ですからこの文字列をそのままハッシュ化します。正しい答えが出れば連鎖全体が検証されたことになり、それ以外なら、リストに触れる前に数式を直してください。

チェックリスト

  1. 元がCSVや貼り付けなら SUBSTITUTE(…, CHAR(160), "")
  2. LOWER(TRIM(…)) ――常に
  3. Gmailのドット/プラス処理――Google Adsの列のみ、この2ドメインのみ
  4. SHA-256、小文字の16進
  5. テストベクターでの確認――リストごとではなく、パイプラインごとに一度

Hash Dataの位置づけ

Hash Dataはこれらの数式の隣、シートの中にハッシュ関数を置きます。正規化してからハッシュ化する流れが、保守すべきスクリプトではなく引き下げ一回で済みます――複数のアルゴリズム、標準的な16進出力を、そのリストがすでに置かれているスプレッドシートの中で。

出典