FileMaker Go の機能、「署名」の偽造を試みようと思います。
想定する状況は、おやつのアメを食べるためにはママの許可(署名)が必要で、時々アメの在庫数とデータの履歴が確認されることにします。
そして、改竄を試みようとする太郎君は完全アクセス権を持つとします。
![おやつのアメ許可書](https://static.wixstatic.com/media/03f5f7_d143408a2ad249f5aff4d6e9df4725a2~mv2.png/v1/fill/w_980,h_527,al_c,q_90,usm_0.66_1.00_0.01,enc_avif,quality_auto/03f5f7_d143408a2ad249f5aff4d6e9df4725a2~mv2.png)
署名偽造の試み1:署名を真似て書く
「ママ」は真似することが簡単でした。
疑念に思ったママは本名の「龍造寺薔薇美」と署名するようにしました。
![お母さんの本名が判明](https://static.wixstatic.com/media/03f5f7_4c99f27a9a5748ed86f3f6835f15fc1d~mv2.png/v1/fill/w_980,h_528,al_c,q_90,usm_0.66_1.00_0.01,enc_avif,quality_auto/03f5f7_4c99f27a9a5748ed86f3f6835f15fc1d~mv2.png)
太郎君は上手く真似することは困難になりました。
署名偽造の試み2:画像データを貼る
太郎君は、署名はPNG形式で書き出せるので、書き出して取り込んでみます。
しかし、署名のタイムスタンプが「?」と表示されます。
![署名の改竄](https://static.wixstatic.com/media/03f5f7_93a423bf4b6b4ede89b3a99d346166b9~mv2.png/v1/fill/w_980,h_525,al_c,q_90,usm_0.66_1.00_0.01,enc_avif,quality_auto/03f5f7_93a423bf4b6b4ede89b3a99d346166b9~mv2.png)
GetContainerAttribute ( 署名 ; "signed" )
という計算フィールドを用意することで署名が書かれたタイムスタンプを得ることが出来ます。署名以外の方法で画像を入れるとタイムスタンプが「?」と表示されます。
別のレコードの署名をコピペしてもタイムスタンプは「?」と表示されます。
太郎君はあきらめました。
署名偽造の試み3:画像データを外部保存にして編集
FileMakerファイルの中に保存されているので署名の改竄がバレると予想し、ファイルを外部保存にします。適当な署名を書き、その署名が外部保存されたファイルに既存の署名を貼り付けて見ました。太郎君はかなり悪いやつです。
しかし、下記のように表示され、その行いも無駄に終わりました。
![太郎君の悪知恵](https://static.wixstatic.com/media/03f5f7_0e21bd010cc74047a80d69a715af5f4d~mv2.png/v1/fill/w_980,h_533,al_c,q_90,usm_0.66_1.00_0.01,enc_avif,quality_auto/03f5f7_0e21bd010cc74047a80d69a715af5f4d~mv2.png)
署名偽造の試み4:レコードを複製する
レコードを複製した場合は署名のタイムスタンプは「?」になりません。
![お母さんの本名の署名](https://static.wixstatic.com/media/03f5f7_b145c037ca774819a9042419119251ee~mv2.png/v1/fill/w_980,h_526,al_c,q_90,usm_0.66_1.00_0.01,enc_avif,quality_auto/03f5f7_b145c037ca774819a9042419119251ee~mv2.png)
ただ、署名のタイムスタンプは更新されないので、左上の日付(許可した日)とずれてしまいます。
太郎君はあきらめました。
署名偽造の試み5:iPhone/iPadの時刻を変更する
太郎君はiPadの時刻を手動で設定することでタイムスタンプを任意の日時にすることを発見しました。 しかし、過去のデータを複製しても署名のタイムスタンプの時刻は変わりません。 署名を太郎君が書いたとしても「龍造寺薔薇美」を違和感なく書くことは困難です。
署名偽造の試み6:レイアウトを編集する
太郎君はそもそもの条件を変更することを考えました。
レイアウトを編集することで前提条件を変えます。
「あなたは、おやつのアメを1つ食べていい。」
↓
「あなたは、おやつのアメを2つ食べていい。」
![契約書の改竄](https://static.wixstatic.com/media/03f5f7_df4796ba6c864281ab0ba282b0e6da2f~mv2.png/v1/fill/w_980,h_521,al_c,q_90,usm_0.66_1.00_0.01,enc_avif,quality_auto/03f5f7_df4796ba6c864281ab0ba282b0e6da2f~mv2.png)
とすれば、2つ食べて良いことになりますから、新たにレコードを複製する必要もありません。相手がこの画面(契約書)を保存していなければ成功です。
(太郎君は改竄がばれて怒られました)
このケースでは単純な契約だったのですぐにバレますが、もっと複雑な文章の一部だと気づきにくいでしょう。
予防策
さて、ここからはママ(龍造寺薔薇美)の対策ターンです。
そもそも太郎君に完全アクセス権を渡さなければいいのですが、完全アクセス権を持った人が改竄した場合にどう防ぐか?という問題として解決してみましょう。
対策1:元のレイアウトの変更に対して
これを完全アクセス権を持っている前提で防ぐのは難しいです。ファイルのバックアップと比較すれば可能かもしれませんが、かなり面倒です。
この対策としては、署名をした段階でPDFを作成してオブジェクトフィールドに保存しておけば良いでしょう。
更にPDF作成時にUUIDでパスワードを設定し、スクリプト実行者ですら解らないようにすればPDFの改竄も困難です。
![作成者も解らないパスワード設定](https://static.wixstatic.com/media/03f5f7_83b2d702bd624aecab9c8a85bcf9c002~mv2.png/v1/fill/w_980,h_877,al_c,q_90,usm_0.66_1.00_0.01,enc_avif,quality_auto/03f5f7_83b2d702bd624aecab9c8a85bcf9c002~mv2.png)
ただ、この方法もレイアウトを変更した後に正しい署名を貼り付ければ同じ様なPDFを作成することが可能です。
防ぐ方法としては、署名した人にPDFを送付しておいて、何かあったときに両者のPDFを比較するということで防げます。
対策2:タイムスタンプの変更に対して
今回は未遂に終わりましたが、iPhone/iPadのタイムスタンプを変更して何か利益を得ることが出来るかもしれません。署名のタイムスタンプは自由に出来ますが、取得関数で得られるホストのタイムスタンプは容易に変更できません。ホストのタイムスタンプを修正したり、ファイルをダウンロードして署名させることで回避できるので完全に対策は難しいかなと思います。
対策3:署名を真似て書くに対して
原始的な方法ですが有効です。
「真似て書く」を完全に防ぐことは難しいので署名を書く側が気をつける必要があります。
まとめ
FileMaker Go の署名の偽造は機能としては署名を書いたタイムスタンプが保存され、修正があった場合は解るようになっている。という仕様でかなり防げるようになっています。
署名欄の下に下記計算式が入ったフィールドを配置しておくだけで予防になるでしょう。
(計算結果はタイムスタンプに設定しましょう)
GetContainerAttribute ( 署名 ; "signed" )
また、署名以外の偽造は署名した時点で、パスワードがかかったPDFを作成することである程度防げます。PDFにパスワードをかける機能の設定は簡単です。
そもそもですが、署名や文書の偽造は犯罪行為に繋がる行為ですので、普通の人ならばそれが抑止力になっているはずです。
![太郎君](https://static.wixstatic.com/media/03f5f7_75bfde7556bf4afea2adb0046953d6d0~mv2.png/v1/fill/w_334,h_400,al_c,q_85,enc_avif,quality_auto/03f5f7_75bfde7556bf4afea2adb0046953d6d0~mv2.png)
3123