HASH( ) 関数
入力値に基づいてソルト付き暗号化ハッシュ値を返します。
構文
HASH(フィールド <,ソルト値>)
パラメーター
名前 | 種類 | 説明 |
---|---|---|
フィールド |
文字 数値 日付時刻 論理 |
ハッシュする値。 |
ソルト値
省略可能 |
文字 数値 |
使用するソルト値。1 から 10 までの これを省略した場合は、Analytics のデフォルトのソルト値が使用されます。 ソルト値は 128 文字に制限されています。それより長いソルト値を指定した場合は、自動的に 128 文字に切り詰められます。 詳細については、ソルト値を参照してください。 |
出力
文字。
例
基本的な例
Analytics のデフォルトのソルト値を使用する場合
"819A974BB91215D58E7753FD5A42226150100A0763087CA7DECD93F3C3090405" が返されます。
HASH("555-44-3322")
Credit_card_num フィールド内の各番号のハッシュ値が返されます。
HASH(Credit_card_num)
ユーザー指定のソルト値を使用する場合
"AD1E7D9B97B6F6B5345AB13471A74C31EBE6630CA2622BB7E8C280E9FBEE1F17" が返されます。
HASH("555443322", "マイ ソルト値 123")
高度な例
同一のハッシュ値が確実に生成されるようにする
クリア テキスト値を統一して同一のハッシュ値を生成するために、HASH( ) とともにその他の関数を使用します。
次の一連の例について考えてください。最初の 2 つの例では、クリア テキスト値の大文字と小文字の違いによって出力のハッシュ値がまったく変更されるかどうかに注目してください。
"DF6789E1EC65055CD9CA17DD5B0BEA5892504DFE7661D258737AF7CB9DC46462" が返されます。
HASH("John Smith")
"3E12EABB5940B7A2AD90A6B0710237B935FAB68E629907927A65B3AA7BE6781D" が返されます。
HASH("John Smith")
次の例では、UPPER( ) 関数を使って大文字と小文字の違いを統一することで、同一のハッシュ値が生成されます。
"3E12EABB5940B7A2AD90A6B0710237B935FAB68E629907927A65B3AA7BE6781D" が返されます。
HASH(UPPER("John Smith"))
HASH( ) を使用した大きなテキストのブロック同士の比較
HASH( ) 関数を使用して、2 つのコメント フィールド内のテキストのブロックが同一であるかどうかをテストすることができます。
このテストを実行するには、以下と同様の 2 つの演算フィールドを作成してから、同一でないテキスト ブロックを見つけるためのフィルターを作成します。
DEFINE FIELD Hash_1 COMPUTED HASH(Comment_Field_1) DEFINE FIELD Hash_2 COMPUTED HASH(Comment_Field_2) SET FILTER TO Hash_1 <> Hash_2
コメント フィールドが別々のテーブルにある場合は、各テーブルに HASH( ) 演算フィールドを作成し、その演算フィールドを共通のキー フィールドとして使用してそれら 2 つのテーブルを不一致結合します。結合された出力テーブル内のレコードは、同一でないテキスト ブロックを表します。
備考
HASH( ) の使用に適する場面
HASH( ) 関数は、クレジット カード番号、給与情報、および社会保障番号などの機密データを保護する場合に使用できます。
機能の仕組み
HASH( ) では一方向のエンコードが行われます。クリア テキストのデータを使用してハッシュ値を生成することはできますが、その後、そのハッシュ値のエンコードを解除したり、ハッシュ値を復号したりすることはできません。
特定のクリア テキスト値は常に同じハッシュ値を生成するため、ハッシュされたクレジット カード番号のフィールドで重複を検索したり、ハッシュされたクレジット カード番号の 2 つのフィールドを結合したりすることができます。この操作を同等のクリア テキスト フィールドで実行した場合、結果は同じになります。
機密データの保護
機密データをサーバー上に保存することを避けるために、ローカルで HASH( ) 関数を使用して演算フィールドを作成することができます。ハッシュされたフィールドとその他必要なフィールドを抽出すると同時に、クリア テキスト フィールドを除外して、新しいテーブルを作成します。分析でサーバー上の新しいテーブルを使用して、一度その結果を得たら、ハッシュされたデータのクリア テキスト バージョンを確認する必要がある場合には、元のテーブルを参照することができます。
初期使用以外で、機密データをローカルに保存することが禁止されている場合は、ハッシュ値を使って新しいテーブルを作成した後、元のテーブルを削除してもかまいません。削除しても、クリア テキスト値について元のソース システムを参照することができます。
クリア テキスト値は同一である必要あり
同一のハッシュ値を生成するためには、2 つのクリア テキスト値はまったく同じでなければなりません。たとえば、同じクレジット カード番号でもハイフンがあるかどうかによって、また、同じ名前でも先頭文字が大文字かすべて大文字かどうかによって、異なるハッシュ値になります。
クリア テキスト値を統一するために、INCLUDE( )、EXCLUDE( )、または UPPER( ) などの関数を HASH( ) 関数に組み込む必要があるかもしれません。
先頭と末尾のスペースは HASH( ) 関数によって自動的に除去されるため、TRIM( ) 関数や ALLTRIM( ) 関数を使用する必要はありません。
先頭や末尾にあるスペースに意味がある場合の処理
値の先頭や末尾にあるスペースで、値間の違いを表しているデータがある場合は、スペースを別の文字に置き換えてから、値のハッシュ値を求める必要があります。
ハッシュ処理を行う前に、フィールド値内のスペースをアンダースコア文字(_)に置き換えます。
HASH(REPLACE(フィールド名, " ", "_"))
HASH( ) で使用される暗号化アルゴリズム
HASH( ) は、SHA-2 暗号化ハッシュ アルゴリズムを使用します。このアルゴリズムでは、入力値の長さに関係なく、64 バイトの固定長のハッシュされた出力が生成されます。クリア テキストの入力値は 64 バイトより長くてもかまいません。
ソルト値
機能の仕組み
HASH( ) 関数によって提供される保護は、ハッシュする前にソルト値を自動的に追加することによって強化されます。ソルト値は、ソース データ値と連結される英数字の文字列です。連結された文字列全体を使用して、ソルト付きのハッシュされた値が生成されます。この手法は、ハッシュされた値の復号技術に対する耐性を強めます。
任意で独自のソルト値を指定する
ソルト値を指定しない限り、固定のデフォルトのソルト値が使用されます。次のいずれかの方法を使用して、ソルト値を指定できます。
-
クリア テキスト文字列としてのソルト値
英数字の文字列を指定します。例:
HASH(Credit_card_num, "my salt value")
-
パスワードとしてのソルト値
HASH( ) 関数と併せて PASSWORD コマンドを使用し、1 から 10 までの PASSWORD 識別番号を指定します。例:
PASSWORD 3 "ソルト値を入力" EXTRACT FIELDS HASH(Credit_card_num, 3) TO "Protected_table"
メモ
HASH( ) 関数のフィールドを抽出するには、その前に PASSWORD のソルト値を入力しておく必要があります。
HASH() とともに PASSWORD 識別番号を使用することの利点は、クリア テキストのソルト値をあらわにしないで済むことです。
詳細については、PASSWORD コマンドを参照してください。
パスワード方式のガイドライン
このパスワード方式は、スクリプトの先頭、あるいはスクリプト内で HASH( ) 関数が現れる前に、パスワードの入力を求めるスクリプトで使用することを目的としています。
PASSWORD の割り当ては Analytics を閉じるときに削除されるため、パスワード方式は演算フィールドでの使用には適していません。
さらに、パスワード ベースのソルト値を使用している演算フィールドは、Analytics を再度開くときにビューから自動的に削除されます。この削除は、デフォルトのソルト値を使用したハッシュ値の再計算を避けるために必要です。再計算される値は、ユーザー指定したソルト値を使って計算された元のハッシュ値とは異なることになります。