Posted at: 2018-03-11 11:42:15  Category: programming

1. したいこと

文字列間の類似度を調べたい.

2. 背景

ホモグラフ攻撃を検出したい。
国際化ドメイン名(IDN Internationalized Domain Name)と証明書を容易に発行できる環境(Let's Encryptとか)が
普及したことから、ブラウザのアドレスバーをぱっと見ただけでは、危ないサイトかどうか見分けがつかない可能性がある.
あるドメイン名(文字列)が、既存の有名サイトのドメイン名(文字列)とどれくらい似ているのか調べたい。

3. 方法

Pythonのdifflibとかlevenshteinとかを使えば、
文字列間の(編集)距離を容易に調べることができる。けれども、目的は人が見た時に文字列同士をどれくらい
誤認しやすいか、を調べること。なので、画像の類似度を算出できる Average Hash を使うことにする。

4. 実装

文字列を画像にして類似度を Average Hash で出す。
効率度外視で実装してみたコード↓(PIL: Python Imaging Libraryを使う)

4. 結果

上記スクリプトを実行してみる。
$ python calculator.py 
microsoft.com      mjcrοsοft.cοm: 0.956062
google.com       gοοgle.com: 0.963840
example.jp       exqmpjε.jp: 0.972960
おはようございます   こんちは: 0.309867
ストロンチウム     ス卜口ンチウム: 0.970743
算出値は0から1の値を取ります。1に近いほど文字列が似てることを示します。

o(オー)はギリシャ文字のο(オミクロン)にしてたり、
e(イー)はε(イプシロン)にしてたりします。

あと、ト(ト)を卜(ボク)にしてるのと
ロ(ロ)を口(クチ)にしてたりします。

わりといい感じになったのかなと思います。