どこでもでむ − 暗号化について
こんにちは、中の人CHOです。
今回は通信の暗号化について説明したいと思います。
有名LPWAはだいたい無線通信が暗号化されています。なぜサーキットデザインの無線機は暗号化していないのでしょうか?
もともと無線はオープンな世界であり、やろうと思えば盗聴も可能である世界です。最近ではデジタル化が進みましたが、見ようと思えば見えてしまいます。
更に言うと、システム全体で暗号化しないと意味がないのです。サーキットデザインの無線機とつながっているのはUARTです。この部分が暗号化されてないと読み放題です。玄関は鍵かけたけど、裏口は開けっ放しでは、あまりにも間抜けですよね。
通信内容の意味さえわからなければ見られても大丈夫というのが暗号化の主な役割です。暗号化をするのなら徹底的にやらないといけないようです。昔暗号化の専門家と話した時は、解読を試みる人にあきらめさせるのが肝心と言ってました。費用対効果が合わないか、理論的に無理であると判断させるかでしょうか。防ぐ仕組みを耐タンパと言うようです。
もし暗号化が破られてしまったらどうするか?どんな攻撃があるのか?どう防ぐののか?ビジネス的にどこまで影響するのか?対応はどうするのか?等々を決めないと、耐タンパ対策をどこまですれば十分なのかわかりません。暗号化の強度、運用方法、色々決めないと設計できません。
それをセキュリティーポリシーの設定といいます。どこまでやるかはモジュールメーカーには決められないのです。中途半端なものを作ってもコストが上がるだけで効果があるか怪しいです。やるなら徹底的にやらないと意味がないです。
と言い訳満載でしたが、サーキットデザインの無線機自体に暗号化がない理由でした。モジュールだけで暗号化している方は大丈夫でしょうか?UARTは丸見えですよ?
「どこでもでむ」は、システムとして運用も可能なので暗号化はやる意味があります。
ただ、セキュリティーポリシーの設定はお客様にお任せします。大事なセキュリティを社外に出してしまってはいけません。どこでもでむは本格的な暗号システムには対応していないので鍵の保管方法は悩ましいと思います。
そんな固いこといわなくてもいいよ、単にデータ保護だけでいいよってことであれば、こちらのサンプルプログラムをご参照ください。
例によって動作保証は致しません。ご自身の判断で、このレベルで良いというのであればお使いください。
パスワードを共通化しておくだけで通信の暗号化ができるようになっています。
送信側
https://gitlab.com/docodemodem/docodemodem-samples/encryption_trans_esp32
受信側
https://gitlab.com/docodemodem/docodemodem-samples/encryption_recv_esp32
仕組みとしては、ランダムSaltとパスワードから暗号鍵を生成してAES128で暗号化し、パケット(通信データのかたまり)のチェックにはCRC16を使っています。
パスワードが漏れたらバレバレの仕組みとなってますので、ご注意ください。セキュリティで重要なのは運用なのです。
実はAESだけではそのパケットが正常なのかどうかはわかりません。パスワードから暗号鍵を作成しますが、その暗号鍵が間違っていてもパケットがビット化けしていても、そのまま復号してしまうのです。そのためCRC16を使って復号化されたデータを検証する仕組みにしています。
Saltを共通化しても良かったのですが、同じデータだと同じ暗号データになってしまうので、どうしてもランダムな値が必要なのです。ここらへんはOpenSSLでも同じです。
SSL/TLS等では公開鍵方式で鍵交換を行っています。詳しくはOpenSSL等を含めて色々な文献をご参照ください。
参考リンク
IoT セキュリティガイドライン ver 1.0 – 総務省