本例の機器台数確認システムは、施設等(滞在者数の推定を実施したい場所)に存在する複数の無線端末3の台数(うち、後述する、Probeリクエストを発信するもの)を数え、当該数をDB23に格納する。
(システム構成)
図1は、本発明の実施の形態による機器台数確認システムの構成例を示す機能ブロック及び動作例のシーケンスを示す図である。
本発明の実施の形態による機器台数確認システムは、滞在者数の推定を実施したい施設等に設置する、複数台の無線傍受装置1と、当該無線傍受装置1とネットワークで接続された集計サーバ2と、を備える。
無線傍受装置1と、集計サーバ2との通信方式は無線通信方式を利用してもよいほか、有線通信方式を利用することもできる。また、集計サーバ2は、施設内に設置してもよいほか、インターネット等を介し無線傍受装置1から通信可能なデータセンター等に設置してもよい。
無線端末3は、機器台数確認システムにて台数を数える対象となる機器である。本発明の実施の形態では、無線端末3は、Wi−Fi方式において、「ステーション」として規定され、かつWi−Fi方式におけるアクセスポイント(以下「Wi−Fiアクセスポイント」と記述する。)に対し、クライアントとして振る舞う機器(以下「Wi−Fiクライアント」と記述する。)を想定する。例えば、スマートフォンや、モバイルPCが該当する。
無線端末3は、自身が接続可能なWi−Fiアクセスポイントを探知するため、Wi−Fi方式において「Probeリクエスト」と呼ばれる種別の電波を、定期的に、周囲の空間に対し発信している。
Probeリクエストには、発信元である無線端末3の、MACアドレスが記載されている。具体的には、図5中の、Address2(P34)に、MACアドレスが、オクテット列として記載されている。
Wi−Fi方式では、Wired Equivalent Privacy(WEP)、Wi-Fi Protected Access 2(WPA2)といった方式により、Wi−FiアクセスポイントとWi−Fiクライアント間の通信内容の暗号化が可能であるが、Probeリクエストの電文において、MACアドレスが記述された箇所(図5におけるAddress2(P34))は、WEP、およびWPA2の規格上、暗号化の対象範囲外であるので、無線端末3のMACアドレスは、可読である。
なお一般に、Wi−FiクライアントがWi−Fiアクセスポイントと通信するにあたっては、事前に当該Wi−Fiアクセスポイントが所属するネットワークの名称であるExtended Service Set ID(以下、「ESSID」と記述する。)や、WEPやWPA2に使用する暗号鍵といった情報を、Wi−Fiクライアントに設定する必要がある。無線傍受装置1が、無線端末3のProbeリクエストの送信対象として受信するのではなく、他を通信対象として発信されたものを傍受しMACアドレスを確認することのみが目的であれば、無線端末3にあらかじめ無線傍受装置1と通信することを前提とした設定を行う作業は不要である。
図2は、図1中の無線傍受装置1の構成例を示す図である。無線傍受装置1は、CPU(Central Processing Unit)101と、メモリ102と、アンテナ部103と、入力装置104と、モニタ105と、通信ポート106と、を備える。CPU101は、プログラムを読み込んで稼働させることにより、MACアドレス抽出部11、Salt取得部12、MACハッシュ断片生成部13として機能する。メモリ102は、半導体メモリなどの記憶装置で構成され、各種情報を記憶可能になっている。例えば、無線傍受装置1として、Wi−Fi方式に対応したノート型またはタブレット型パソコンやスマートフォン等に、サーバ(例えば集計サーバ2)からプログラムを供給しインストールして使用する形態が考えられる。
アンテナ部103は、ハードウェアとしての金属製導電体であるアンテナ(図示せず)とCPU101が実行するプログラムとの組合せであり、無線端末3が発信するWi−Fi方式による電波を傍受(受信)し、その内容を、無線傍受装置1のCPU101が実行するプログラムが読み取り可能なオクテット値の列である電波ダンプ52に変換し、当該電波ダンプ52をメモリ102に保存する機能を有する。アンテナ部103は、後述するSalt取得部12からの指示により、電波の傍受を開始しまたは停止する。
なお、Wi−Fi方式では、複数の周波数帯の利用が許可されており、どの周波数帯で通信を行うかは、Wi−Fiアクセスポイント、およびWi−Fiクライアントの設定、および通信開始前の両者の調停に委ねられている。このためアンテナ部103は、これらの周波数帯を順次傍受する機能を有してもよい。
例えば、ある1つの周波数帯を、15秒間傍受し、その間に傍受したProbeリクエストについて、電波ダンプ52をメモリ102に保存し、次いで、異なる周波数帯の傍受に遷移する、といった機能である。
なお、アンテナ部103は、傍受する周波数帯を、本システムを運用する時点で、一般に流通しているWi−Fi対応機器(特に、個人が持ち歩く機器である、携帯電話、スマートフォン等)の多くが使用している周波数帯を鑑みて決定してもよい。2014年6月の時点では、Wi−Fi方式のうちIEEE802.11b方式およびIEEE802.11g方式に対応したWi−Fi機器が使用する2.412GHz±10MHzの範囲(第1チャネル)と、2.437GHz帯±10MHzの範囲(第6チャネル)と、2.462GHz±10MHzの範囲(第11チャネル)と、IEEE802.11a方式、およびIEEE802.11n方式に対応したWi−Fi機器が使用する、5.15GHzから5.35GHzの範囲と、5.47GHzから5.725GHzの範囲とを傍受の対象とすることが、無線端末3として捕捉可能な機器の数を増大させる上で合理的と考えられる。
加えてアンテナ部103は、電波ダンプ52のメモリ102へのデータ保存に先立ち、傍受した電波が確かにWi−Fiクライアントが発信したProbeリクエストであるか否かを、電波ダンプ52のオクテット列にWi−Fi方式においてProbeリクエストを識別するために割り当てられたビット列のパターンが含まれるかによって確認し、電文が、Probeリクエストである場合にのみ当該電文に対応する電波ダンプ52の保存を行う機能を有してもよい。
具体的には、電波ダンプ52のオクテット列において、図5中の、Type(P312)で示される部分のビット列が「00」であり、かつ、Subtype(P313)で示される部分のビット列が「0100」である場合にのみ、当該電波ダンプ52を、メモリに保存する機能である。
これは、本システムの動作に必要の無い情報は、プライバシー保護の観点から、可能な限り本システムに保存しないようにするための措置である。
入力装置104は、人間の操作により、無線傍受装置1を起動したり、メモリに値を入力する機能を有する。例えば、キーボード等の装置が想定される。
モニタ105は、無線傍受装置1のメモリ102の内容等を、人間が目視可能な形式で表示する装置である。例えば、液晶ディスプレイ等の装置が想定される。入力装置104、およびモニタ105は、無線傍受装置1と同一の筐体に接続してもよいほか、ネットワーク上の他の場所に設置し、通信ポート106を介し、無線傍受装置1と、メモリ操作等に係る通信を実施する形態でもよい。
通信ポート106には、ネットワークケーブル等が接続され、CPU101が実行するプログラムの求めに応じ、ネットワークに対し、電文の送受信を行う機能を有する。
図3は、図1中の集計サーバ2の構成例を示す図である。集計サーバ2は、CPU201と、メモリ202と、入力装置204と、モニタ205と、通信ポート206と、を備える。CPU201は、プログラムを読み込んで稼働させることにより、Salt取得部21、乱数生成部22、ユニーク値カウント部25として機能する。例えば、集計サーバ2として、無線傍受装置1と同一の拠点に設置したノート型パソコンを使用する形態や、インターネット上のデータセンター等に設置した、サーバ型コンピュータを使用する形態が考えられる。
入力装置204は、人間の操作により集計サーバ2を起動したりメモリ202に値を入力する機能を有する。例えば、キーボード等の装置が想定される。
モニタ205は、集計サーバ2のメモリ202の内容等を、人間が目視可能な形式で表示する装置である。例えば、液晶ディスプレイ等の装置が想定される。入力装置204、およびモニタ205は、集計サーバ2と同一の筐体に接続してもよいほか、ネットワーク上の他の場所に設置し、通信ポート206を介し、集計サーバ2と、メモリ操作等に係る通信を実施する形態でもよい。
通信ポート206には、ネットワークケーブル等が接続され、CPU201が実行するプログラムの求めに応じ、ネットワークに対し、電文の送受信を行う機能を有する。
DB(Data Base)23は、HDD(Hard Disk Drive)や半導体メモリなどの記憶装置で構成され、各種情報を記憶可能になっている。本DB23は、集計サーバ2に内蔵されずに外付けでもよい。
図1に戻り、無線傍受装置1は、アンテナ部103が傍受したProbeリクエストからMACアドレスを抽出する、MACアドレス抽出部11と、後述する集計サーバ2のSalt応答部21から、ランダムな数値(以下、「Salt」と記述する。)を取得する、Salt取得部12と、MACアドレスと、Saltから、MACハッシュ断片を生成する、MACハッシュ断片生成部13と、前記MACハッシュ断片を、集計サーバ2の、後述するデータ受信部24に送信する、データ送信部14と、を備える。
集計サーバ2は、後述する乱数生成部22からSaltを受け取り、無線傍受装置1のSalt取得部12に、Saltを応答する、Salt応答部21と、前記Salt応答部21にSaltを応答する、乱数生成部22と、リレーショナルデータベースであるDB23と、前記の無線傍受装置1のデータ送信部14から、MACハッシュ断片を受信する、データ受信部24と、MACハッシュ断片に含まれるユニークな値の数を数え、DB23に記録する、ユニーク値カウント部25と、を備える。
(機器台数確認システムの動作シーケンス例)
以下、本システムの動作シーケンスを説明する。図1に、動作シーケンス例を示す番号(S1〜S21)を記載している。
Salt取得部12は、定期的に起動し、メモリ102から、無線傍受装置1が設置された場所を表す文字列である施設ID41と、アンテナ部103が電波を傍受する時間長を表す数値である傍受時間53と、を読み込み、集計サーバ2のSalt応答部21に対し、施設ID41を含む電文を、ネットワークを介して送信する(S1)。
なお、施設ID41と傍受時間53とは、無線傍受装置1の設置時等に施設の管理者等が無線傍受装置1の入力装置104を用いて設定し、無線傍受装置1のメモリ102に保持されている。
一台の無線傍受装置1は、複数個の施設ID41を同時に保持でき、Salt応答部21への通信処理(S1)乃至、後述するSalt応答部21から返却されたSalt43とビットマスク50の保存処理(S7)は、保持する施設ID41の数だけ繰り返し実施する。ただし、同じく後述する、アンテナ部103への起動指示(S8)、およびMACアドレス抽出部11の起動処理(S9)は、保持する施設ID41の数によらず、一度だけ実施する。
加えて、Salt取得部12の起動周期はあらかじめ施設の管理者等が無線傍受装置1の入力装置104を用いて設定し、Salt取得部12はこの設定に基づき定期的かつ自動的に処理を開始してもよいほか、ネットワーク経由で無線傍受装置1からアクセス可能な集計サーバ2内の領域に、「Salt取得部12に、処理S1の実行を指示するファイル等」を集計サーバ2の管理者等が作成して設置し、無線傍受装置1はこの領域に当該ファイルが設置されているか否かを定期的に確認し、設置されている場合に処理を開始する形態でもよい。
Salt応答部21は、無線傍受装置1のSalt取得部12が実施するS1の処理によって施設ID41を受信するまで待機し、受信後、集計サーバ2のメモリから現在時刻42とビットマスク50と時刻粒度指定54とを読み出す。
ここで、時刻粒度指定54とは、Salt応答部21から受け取った現在時刻42のどの単位(時、分、秒)より細かい部分を切り捨てるかをSalt応答部21に指示する文字列である。例えば、時刻粒度指定54に「時より細かい部分を切り捨てる」旨の記述がなされており、現在時刻42が「2014年6月26日20時34分56秒」であった場合、Salt応答部21は、現在時刻42を、「2014年6月26日20時00分00秒」と見做すこととする。
このように、現在時刻42の値の、特定の単位(時、分、秒)より細かい部分を切り捨てることにより、ある一つの施設に設置した、複数台の無線傍受装置1が、それぞれ処理S1を実行するタイミングが、正確に分や秒単位で同一でない場合でも、無線端末3の数を、重複なく集計することができ、本システムの信頼性を、一層向上させることができる。
すなわち、無線傍受装置1が処理S1を実行し後述の乱数生成部22に施設ID41が到達するタイミングは、無線傍受装置1と集計サーバ2との間のネットワークの混雑状況や、無線傍受装置1のCPUの負荷により変動する可能性があり、その変動量は予測が困難である。このため、複数台の無線傍受装置1が、たとえ真に同時に処理S1を開始した場合でも、施設ID41を含む電文が、Salt応答部21に到着する時刻は、少なくとも秒単位で異なる恐れがある。もし、現在時刻42の、分未満の部分の切り捨てを行わなかった場合、後述する乱数生成部22に、秒の部分が異なった、現在時刻42の値が入力されることとなり、最終的に、後述するユニーク値カウント部25に読み込まれる、SaltHash45の値が、送出元の無線傍受装置1ごとに異なる事態となり、処理S20において、「SaltHash45と、当該SaltHash45に紐付いた、1個以上のMACハッシュ断片47との組」を、グループ化することができない。つまり、複数の無線傍受装置1が、同一の無線端末3(同一のMACアドレス44)から傍受した電波が、Salt43が異なることでMACハッシュ断片47も異なってしまって別な無線端末3からのものであると誤判定され、無線端末3の正確な総数を求めることができない。
以上の理由から、Salt応答部21は、時刻粒度指定54に基づく現在時刻42の切り捨て処理を実施後、当該施設ID41と現在時刻42(切り捨て後のもの)との組を乱数生成部22に入力する(S2)。
なお現在時刻42は、集計サーバ2のオペレーティングシステム等が、Salt応答部21の処理とは独立して1秒ごとに生成し、集計サーバ2のメモリ102上に保存する。また、ビットマスク50と、時刻粒度指定54とは、集計サーバ2の管理者等が、本システムの設置時等に、集計サーバ2のコンソールを用いて設定し、集計サーバ2のメモリ上に保存する。時刻粒度指定54は、複数台の無線傍受装置1の間で発生しうる処理S1の実行タイミングの時差を踏まえ決定する。
乱数生成部22は、Salt応答部21から施設ID41と現在時刻42との組が処理S2によって入力されるまで待機し、入力後、集計サーバ2のメモリから乱数シード51を読み出す。乱数シード51は、予測が困難なランダムな値である。
乱数シード51は、集計サーバ2の管理者等が本システムの設置時等に集計サーバ2のコンソールを用いて設定し、集計サーバ2のメモリ上に保持されている。
次いで乱数生成部22は、Salt応答部21から入力された施設ID41と、現在時刻42(時刻粒度指定54に基づき細かい部分の切り捨てを行った後の値)と、乱数シード51を結合したオクテット列を生成し、当該オクテット列の第1オクテットに対し、第2オクテット以降のオクテットを順に排他的論理和(ビット値同士のExclusive OR)にて合算してゆき、最終的な第1オクテットの値を「入力値が同じであれば、同一の結果を返す疑似乱数生成関数」に入力し、結果をSalt43として取得し、当該Salt43をSalt応答部21に出力する(S3)。
ここでSaltとは、暗号化する文字列に付与することで、暗号のセキュリティを高めるものである。簡略な方法によってSaltを生成してもよいが、本実施例のようにSalt43を生成すれば、よりセキュリティを高めることができる。
なお、「入力値が同じであれば、同一の結果を返す疑似乱数生成関数」として、POSIX.1-2001規格におけるsrand関数等が挙げられる。疑似乱数生成関数は、一般的に、入力値が取り得る値の範囲が広ければ広いほど、出力値の推測が困難となる。このため、疑似乱数生成関数が、1オクテットより長い値を入力値として受け入れ可能な場合、前記処理は、第1オクテットに第2オクテット以降の値を順に適用してゆく形に代えて、先頭から複数オクテットの範囲に対し、後続する同じ長さの範囲のオクテット列を順に排他的論理和にて合算する形態とし、より一層、本システムのセキュリティレベルを向上させてもよい。
Salt応答部21は、乱数生成部22からSalt43を受け取り(S3)、当該Salt43のハッシュ値であるSaltHash48を計算し(S4)、当該SaltHash48を主キーとして、DB23に、SaltHash48と施設ID41と現在時刻42とを記録する(S5)。DB23には、図4に示すような情報が記録される。そして、Salt43とビットマスク50との組を、無線傍受装置1のSalt取得部12に応答する(S6)。S4及びS5は、後述の集計(S20)のためである。なおDB23は、リレーショナルデータベースであり、主キーに紐付いた複数個のデータを、他のプログラムからの求めに応じ保存または出力することができる。
処理S4の説明中の「ハッシュ値」とは、ある値を「ハッシュ関数」と呼ばれる関数に入力した結果得られる出力値である。ハッシュ関数の出力値、すなわちハッシュ値の長さ(オクテット数)は、入力値のオクテット数や値によらず一定という特性を有する。また、ハッシュ関数は、同じ入力値に対し必ず同じ値(ハッシュ値)を出力するという特性と、少しでも入力値が異なる場合まったく異なる値(ハッシュ値)を出力するという特性と、を有する。なお、ハッシュ値から入力値を復元することや、同じハッシュ値を持つ複数の入力値を推定することは、数学的に困難である。このような特徴を有するハッシュ関数は、複数個が知られているが、本実施形態ではSHA-256(Secure Hash Algorithm 256)を使用する。SHA-256の出力値は、256ビット(32オクテット)である。本実施例では、ハッシュ関数を用いるが、暗号化後のデータから暗号化前のデータを復元できない非可逆的暗号化であり、同じ暗号化前データからはほぼ毎回同じ暗号化後データを作成する暗号化であれば、他の暗号化(データ変換)を用いてもよい。
次いでSalt取得部12は、Salt応答部21から、Salt43と、ビットマスク50と、を受信し(S6)、当該Salt43と、ビットマスク50と、を無線傍受装置1のメモリ上に保存し(S7)、無線傍受装置1のアンテナ部103に対しWi−Fiクライアントが発する電波の傍受の開始を指示し(S8)、当該傍受時間53で示された時間待機した後に、アンテナ部103に対し電波の傍受の停止を指示し、MACアドレス抽出部11を起動する(S9)。
MACアドレス抽出部11は、Salt取得部12からの起動指示(S9)により起動する。
MACアドレス抽出部11は、無線傍受装置1のアンテナ部103が傍受し、メモリ102に保存した、Probeリクエストの電文に基づき生成されたオクテット列である電波ダンプ52を読み取り(S10)、当該オクテット列において、図5中のType(P312)で示される部分のビット列が「00」であり、かつ、Subtype(P313)で示される部分のビット列が「0100」である場合(すなわちWi−Fi方式において、Probeリクエストを表すビットパターンである場合に限り)、更に図5中の、Address2(P34)で示される部分のオクテット列(6オクテット)を読み取る。P34から読み取ったオクテット列は、無線端末3のMACアドレス44である。読み込んだMACアドレス44は、既に読み取ったMACアドレス44と比較し、同じMACアドレスを2回以上読み込んでいる場合には2回目以降のものは削除して重複を防ぐ。
次いでMACアドレス抽出部11は、読み取ったMACアドレス44を引数として、MACハッシュ断片生成部13を起動する(S11)。
なお、無線端末3の台数や、無線端末3によるProbeリクエストの発信のタイミング、アンテナ部103による傍受周波数帯の選択のタイミング、ならびに、アンテナ部103が、傍受に費やした時間(すなわち、傍受時間53の値)の長短によっては、アンテナ部103は、複数回、無線端末3が発信した電波を傍受する可能性があり、その場合、複数個の電波ダンプ52が、メモリ102に保存される。その場合、MACアドレス抽出部11は、メモリ102に保存された、すべての電波ダンプ52について、MACアドレス44を読み取り、複数個のMACアドレス44を引数として、一回だけ、MACハッシュ断片生成部13の起動(S11)を実施する。
以上の処理の完了後、MACアドレス抽出部11はメモリ102に保存された電波ダンプ52をすべて削除してもよい。この削除処理は、電波ダンプ52がもはや後段の処理で使用されないことを踏まえ、万一悪意のあるプログラムや管理者によって無線傍受装置1のメモリが窃視された場合に無線端末3の所有者のプライバシーが侵害されるリスクを低減するための措置である。
MACハッシュ断片生成部13は、MACアドレス抽出部11からの起動指示(S11)により起動する。起動の際、MACアドレス抽出部11から、引数として1個以上のMACアドレス44を受け取り、Salt取得部12が無線傍受装置1のメモリ上に保存したSalt43とビットマスク50との組を読み取る(S12)。
そして、当該Salt43のハッシュ値を計算する(S13)。このハッシュ値をSaltHash45と記述する。このステップ15は省略可能であり、ハッシュ値計算をする前のSalt43を使用することができる。しかし、不正に傍受した者が、Salt43と後述のMACハッシュ断片47等を用いて解読するおそれがあり、本ステップ13でハッシュ値化した方が、不正に傍受した者が解読する難易度が上がり、セキュリティが高くなる。
また、本SaltHash45とSalt43は、集計サーバ2と無線傍受装置1間で共有できていればよいので、無線傍受装置1内でSalt43から作成するのではなく、集計サーバ2から無線傍受装置1から送信して共有してもよいし、その逆でもよい。
次いで、MACハッシュ断片生成部13は、MACアドレス抽出部11から引数として受け取ったMACアドレス44とSalt43とを結合したオクテット列のハッシュ値を計算する(S14)。同じハッシュ値が生成されるのは、組合わせたMACアドレス44とSalt43がともに同じ場合のみである。この計算の結果得られたハッシュ値(MACHash46)と、ビットマスク50の論理積(ビット値同士のAND)を計算する(S15)。このS15は省略可能であり、ハッシュ値(MACHash46)を集計サーバ2に送ることもできるが(S6、S7及びS12のビットマスク50にかかる送信等も省略できる)、論理積であるMACハッシュ断片47を送信した方が、それを不正に傍受した者が情報の復元が困難であり、セキュリティが高まる。
そして、計算した結果の値を、MACハッシュ断片47としてSaltHash45と紐付けて組とし、当該組を引数としてデータ送信部14を起動する(S16)。
なお、MACアドレス抽出部11から、複数個のMACアドレス44を引数として受け取った場合、MACハッシュ断片生成部13は、それぞれのMACアドレス44に対し、MACハッシュ断片47を導出する処理(S14、およびS15)を実施し、結果として、単一のSaltHash45に、複数個のMACハッシュ断片47が紐付いた組を生成し、この組を、データ送信部14を起動する際の引数とする。
また、Salt取得部12が無線傍受装置1のメモリ上に保存したSalt43と、ビットマスク50との組が複数個存在する場合(すなわち、施設ID41が、複数個設定されており、もって処理S1乃至S7が、複数回、実施された場合)、MACハッシュ断片生成部13は、それぞれの組に対し、処理S13乃至S16を実施し、もって「Salt43と、ビットマスク50との組」の数だけ、「単一のSaltHash45に対し、複数個のMACハッシュ断片47が紐付いた組」が生成される。MACハッシュ断片生成部13は、この複数個の組を引数として、データ送信部14を、1回だけ起動して送信する(S16)。
なお、この場合、Salt43、およびSaltHash45の値は、組により異なるが、処理S14に入力するMACアドレス44の値はどの組についても同一である(すなわち、施設ID41の数だけ、S14乃至S15を、繰り返し実行する。この繰り返しにおいてSalt43の値はその都度異なるが、MACアドレス44の組は、毎回同一である)。
以上の処理の完了後、MACハッシュ断片生成部13は、無線傍受装置1のメモリ102からSalt43とビットマスク50とをすべて削除してもよい。この削除処理は、Salt43と、ビットマスク50と、が、もはや後段の処理で使用されないことを踏まえ、万一、悪意のあるプログラムや管理者によって、無線傍受装置1のメモリが窃視された場合に、無線端末3の所有者のプライバシーが侵害されるリスクを低減するための措置である。
以上の実施形態で、処理S14乃至S15を実施する理由は、MACアドレス44を、元の値に復元が困難な値に変換することで、「特定のMACアドレス44を持つ機器の保有者(個人)が、ある特定の時刻に、ある特定の場所(無線傍受装置1が設置された場所)に滞在していた」ことを、他者から推測困難とするためである。
以上の理由から、処理S14では、MACアドレス44に、Salt43を結合した値に対し、ハッシュ値を計算することとしている。
ただし、MACアドレスが理論上取り得る値は、約3269億通りである。これは、MACアドレスの上位3オクテットが取り得る19,483通り(IEEE OUI, [online], [2014年6月20日検索], インターネット<http://standards.ieee.org/develop/regauth/oui/oui.txt>参照)に、下位3オクテットが取り得る2の24乗を乗じた積である。よって、もしSalt43が攻撃者にとって公知であると、攻撃者は、「MACアドレスが理論上取りうる約3269億通りのMACアドレス44についてハッシュ値を計算する処理」に代わり、「約3269億通りのMACアドレス44にそれぞれSalt43を結合した値についてハッシュ値を計算する処理」を実施すればよく、この場合、結果のハッシュ値の保存に必要な領域のサイズは変わらず、計算の所要時間のみSalt43のオクテット数に応じ等差級数的に伸びることとなる。仮にSalt43が、6オクテットの長さを持つ場合、ハッシュ値計算の対象オクテット数は2倍となり、所要時間も、約1,400,000秒(約390時間)と、前記の2倍となる。しかしながら、現在では数百台のコンピュータを個人で利用することも困難ではなく、それらのコンピュータをもって並列でハッシュ値の計算を行うことで、攻撃者はSalt43を追加したことによる計算量の増大を十分に吸収できる。一般的に、コンピュータの処理能力は、経年の、技術革新により、等比級数的に増大する傾向があるので、これに対抗するには、Salt43の長さも、等比級数的に増大させる必要があるが、そうした場合、本システム側でも、ハッシュ値の計算に係る計算能力、すなわち無線傍受装置1や集計サーバ2の計算能力を、等比級数的に増強する必要が生じ、本システムを導入する者にとって費用負担の原因となる。
以上の理由から、MACハッシュ断片生成部13は、Salt43を公知とするべきではなく、代わって処理S16において、Salt43ではなくそのハッシュ値であるSaltHash45を出力することで、より一層本システムのセキュリティレベルを向上させることができる。なぜなら、SaltHash45のみ出力することで、攻撃者はSalt43の値を知ることができなくなり、たとえMACHash46の値を知ることに成功した場合であっても、元のMACアドレス44を知るには、Salt43が取り得るすべての値に対し、それぞれMACアドレス44を結合し、処理S14と同様のハッシュ値を計算し、それがMACHash46と一致するか、を検証する必要が生じ、この計算に要する時間は、Salt43の長さ(オクテット数)に応じ、等比級数的に増大するため、無線端末3の保持者のプライバシー保護の観点から好ましい。
なお、そもそもSaltHash45を集計サーバ2に送信するデータに含める理由は、この値に基づいて後述のユニーク値カウント部25にて同一の施設(同一の施設ID41が設定された、複数台の無線傍受装置1)から送信されたMACハッシュ断片47をグループ化するためである。その目的を達成できさえすれば、他の値をSaltHash45に代わってMACハッシュ断片47の紐付けに使用してもよい。例えば、処理S6において、Salt応答部21が、Salt43と、ビットマスク50に加え、更にSalt43とは別の適当なランダム値(ただし、Salt43と同様に、施設ID41と、現在時刻と、が同一であれば、同一の値となる)を、Salt取得部12に返信し、MACハッシュ断片生成部13は、当該ランダム値をSaltHash45の代わりに処理S16にて使用してもよい。Salt応答部21はそのランダム値を適切な情報に対応付けてDB23に記憶しておけば、データ送信部14から集計サーバ2にMACハッシュ断片にひもづけられたランダム値に基づいて、そのMACハッシュ断片のプロフィール(施設ID41や、MACアドレス取得を指示した時刻など)を知ることができる。
加えて、MACHash46とビットマスク50との論理積演算(ビット同士のAND)を、処理S15にて実施することにより、乱数シード51を知りうる者、すなわち処理S3で、乱数生成部22が返すSalt43の値を容易に検算できる者に対し、元のMACアドレス44を隠蔽することができる。乱数シード51を知りうる者には、集計サーバ2の管理者等が含まれる。
なぜなら、乱数生成部22が使用する疑似乱数生成関数は仕様が公知であり、加えて施設ID41と現在時刻42とはDB23にて公開されうる情報であるから、攻撃者は、加えて乱数シード51を知ることさえできれば、任意の時刻に施設ID41を発信した無線傍受装置1に返送されるSalt43を容易に計算でき、ひいては前記のとおりSalt43のオクテット数に対し等差級数的にしか増大しない計算時間をもって、元のMACアドレス44を導出できる。
但しここで、MACHash46の一部を消去(一部のビットの値を、強制的に0で上書き)することで、複数個の値が元のMACアドレス44の候補たりうることとなる。つまり攻撃者は、MACHash46の元となったMACアドレス44を一意に決定できなくなる。「元のMACアドレス44たりうる値」の数は、2の「消去したビット数」乗個である。このように、処理S15を実施することで、無線端末3の保持者の匿名性を、本システムの管理者等、乱数シード51を知りうる者に対しても担保でき、一層、本システムのセキュリティレベルを向上させることができる。
なお、MACHash46の一部を消去することで、当然、あるSalt43と、複数台の無線端末3から得られた、複数個の、それぞれ異なるMACアドレス44とから、同一のMACハッシュ断片47が、MACハッシュ断片生成部13により生成される場合がある。しかしながら、これはわずかな確率であり、一人一台無線端末3を所有していることを前提に人数をカウントすることによる誤差に比べれば、誤差として無視できる範囲と考えられる。
なお、例えば、公民館、体育館といった施設であれば、物理的に収容できる人数の最大値が、何百人程度であるか、もしくは何千人程度であるか、といった、大まかな推計は可能と考えられるため、本システムの管理者は、集計対象の施設の収容人数の規模を考慮し、ビットマスク50の値(消去するビット数)を設定してもよい。また、Salt応答部21は、複数個のビットマスク50を保持し、処理S6において、施設ID41の値に応じ、異なるビットマスク50を、Salt取得部12に返却してもよい。また、ビットマスク50を使用する目的は、前述のとおり乱数シード51を知りうる者に対し元のMACアドレス44を推測困難とすることであるから、必ずしも集計サーバ2の管理者がビットマスク50の値を設定し無線傍受装置1に対し提供する形態とする必要は無く、無線傍受装置1の管理者が無線傍受装置1にビットマスク50の値を設定し、MACハッシュ断片生成部13はその値を使用する形態としてもよい。
データ送信部14は、MACハッシュ断片生成部13からの起動指示(S16)指示により起動する。起動の際、MACハッシュ断片生成部13から、引数として、1個以上の「単一のSaltHash45に、一個以上のMACアドレス44が紐付いた組」を受け取り(S16)、当該組を、集計サーバ2のデータ受信部24に対し、ネットワークを介して送信する(S17)。なお前記ネットワークは、Salt取得部12が、処理S1にて、Salt応答部21との通信に使用したものを兼用できる。
集計サーバ2のデータ受信部24は、無線傍受装置1のデータ送信部14から、SaltHash45と、当該SaltHash45に紐付いた、1個以上のMACハッシュ断片47との組、を受信するまで待機し、受信後、受信したSaltHash45と、当該SaltHash45に紐付いた、1個以上のMACハッシュ断片47との組、を、集計サーバ2のメモリに保存する(S18)。
ユニーク値カウント部25は、データ受信部24が、新たなSaltHash45と、当該SaltHash45に紐付いた1個以上のMACハッシュ断片47との組がメモリに保存されているかを、あらかじめ集計サーバ2の管理者等によって定められた周期で調べ、新たな組が保存されている場合、当該メモリ102に保存されている、「SaltHash45と、当該SaltHash45に紐付いた1個以上のMACハッシュ断片47との組」をすべて読み込み(S19)、すべての組のうち同一のSaltHash45を持つ組が含有する、すべてのMACハッシュ断片47の集合の中に、ユニークな(一意な)値が、何個含まれているかを数える(S20)。以下、処理S20の動作の詳細を、図6を用いて説明する。
ユニーク値カウント部25は、空の(データを何も含まない)連想配列Cを生成する(S20-1)。なお連想配列とは、プログラム言語における配列(データの集合)の一種である。
プログラム言語における配列は、通常添字により集合における何番目のデータであるかを指し示す。例えば、5個のデータを含む配列(仮に名称をAとする)の3番目のデータはA(3)のように表す。
一方で、連想配列は、連想配列内の個々のデータに紐付けられた「文字列」で、個々のデータを指し示す。例えば、1という数字(データ)を、文字列xに紐付けて記憶し、かつ2という数字(データ)を、文字列yに紐付けて記憶した連想配列(仮に、名称をCとする)では、2というデータは、C("y")のように表す。ここで、xやyのような文字列を、「キー」という。
連想配列の仕組みは、Java(登録商標)、Perl(登録商標)、C#(登録商標)等の、主要なプログラム言語に備えられている。
なお連想配列は、データとして、更に別の連想配列を格納でき、例えば、前記の連想配列C全体を、単一のデータの塊と見做し、"B"という文字をキーに、更に別の連想配列Pに格納したとすると、連想配列Cは、P("B")と表記でき、Cが含む、前記2というデータは、P("B")("y")のように表記できる。このような場合、連想配列Pを、親配列と呼び、連想配列Cを、子配列と呼ぶ。
次いでユニーク値カウント部25は、「SaltHash45と、当該SaltHash45に紐付いた、1個以上のMACハッシュ断片47との組」に対し、それぞれ、ループ処理S20-2を実施する。すなわち、ユニーク値カウント部25は、当該組からSaltHash45の値を読み出し、これを変数shに記憶し(S20-3)、連想配列Cにキーshを持つデータ、すなわちC("sh")が存在するか確認し(S20-4)、存在しない場合、連想配列Cに「空の連想配列」を、shをキーとするデータ、すなわちC("sh")として新規に作成し(S20-5)処理S20-6に進み、存在する場合、何もせず処理S20-6に進み、更に前記組が含むMACハッシュ断片47の全てに対し、それぞれループ処理S20-6を実施する。すなわち、MACハッシュ断片47の値を読み出し、これを変数vに記憶し(S20-7)、値C("sh")、すなわち処理S20-5で作成した、子配列である空の連想配列に、1という数値を、キーvで作成する(S20-8)。言い換えると、C("sh")("v")に、値1を設定する。なお、既にC("sh")("v")に、値1が設定されていた場合、すなわち、既に同一の値を持つMACハッシュ断片47に対し、処理S20-7乃至S20-8を実行済みの場合、S20-8を実施しないこととしてもよく、C("sh")("v")を、値1で、上書きしてもよい。以上で、ループ処理S20-6は終端する。
次いでユニーク値カウント部25は、S20-2の完了後、当該組を、メモリ102から削除し、以上で、ループ処理S20-2は終端する。
次いでユニーク値カウント部25は、Cの持つキーすべてに対し、以下のループ処理S20-10を実施する。すなわち、
ユニーク値カウント部25は、キーshを、連想配列Cから読み(S20-11)、
値C("sh")、すなわち子配列である連想配列が持つ、キーの数を数え、当該数を、変数tに設定し(S20-12)、
DB23に対し、「当該shの値を主キー(図4における、SaltHash(T01))に持つ行の、ユニーク値の数を保存する項目(図4におけるT04)に、当該vの値を設定する」電文を送信する(S20-13)。なお、処理S20-13は、すなわち処理S21である。
以上で、ループ処理S20-10は終端する。
以上の処理の完了後、DB23には、施設ID41で示される施設毎に、MACアドレス44の重複を排除して、無線端末3の台数が記録される。
なお、施設によっては、施設管理者等が保有する、業務用携帯電話等が設置されている場合があり、これらの機器は、訪問者の数として計測したくない場合があると考えられる。このような場合に備え、DB23には、補正数(図4におけるT05)という項目を設け、集計サーバ2の管理者等は、あらかじめこの項目に、施設ID41ごとに、想定される、業務用携帯電話の台数等を登録しておき、DB23が、無線端末3の台数として、ユニーク値の数(T04)から、補正数(T05)を除した値を返却できるようにしてもよい。
以上説明した通り、本実施例では、MACアドレス44にかかる情報を暗号化して集計装置2に渡して匿名性を保持するとともに、同じMACアドレス44は暗号化後も同じデータとなるようにすることで、重複を排除して一意なユニーク値を数えることができる。