Android BLE接続にアプリケーションレベルの暗号化を追加するにはどうすればよいですか?
アンドロイドのBluetooth低エネルギーのドキュメントには、交換されるデータが敏感な場合には、トップBLE接続のアプリケーション層の暗号化を追加することをお勧めします。
注意:ユーザーがBLEを使用してデバイスを別のデバイスとペアリングすると、2つのデバイス間で通信されるデータに、ユーザーのデバイス上のすべてのアプリからアクセスできます。
このため、アプリが機密データをキャプチャする場合は、そのデータのプライバシーを保護するためにアプリレイヤーセキュリティを実装する必要があります。
「独自の暗号化を使用する」ことは避けたいので、パケットを暗号化するための本番環境に対応した方法を探しています。
ある参加者から別の参加者(QRコード)に1つのメッセージ(キーなど)を交換するための帯域外チャネルがあります。両方の参加者はAndroidデバイスであり、1つはサーバーモード(ペリフェラル)で動作し、もう1つはクライアント(セントラル)として動作します。
Noise Protocol FrameworkをTLSのより軽量な代替手段と見なしましたが、それでも手作業が多いように感じます(?)。
簡単な解決策はありますか?これは解決された問題でなければならないようです。
回答
まず、アドバイスの言葉:StackExchangeは特定の製品を推奨するためのものではないので、ここでは比較的一般的にします。将来これを読む人は誰でも、新しくてはるかに優れた選択肢がある世界、あるいは古い警備員が壊れていることがわかった世界にいるかもしれません。
事前共有キーが与えられると、最小限の労力でメッセージまたは場合によってはストリーム暗号化(およびデータ整合性などの関連するセキュリティ要件)を処理する高レベルの暗号化ライブラリがいくつかあります。「簡単な暗号ライブラリ」を検索するだけで、いくつかの候補が見つかります。多くの人があなた自身の暗号を転がすことに対するアドバイスを無視していることに注意してください、そして彼らの何人かはそれを公開します、それであなたはあなたが選ぶライブラリが専門家によってよくレビューされていることを確認したいです、理想的にはその開発とは無関係です。
また、ライブラリから正確に何が欲しい(そして必要なのか)を検討する必要があります。任意の長さの暗号化されたストリーム(またはメモリに簡単に収まらない非常に大きなメッセージ)をサポートする必要がありますか、それとも単純なメッセージベースのプロトコルが機能しますか?インストールフットプリントまたはRAM使用量において、ライブラリを非常に小さくする必要がありますか?特定のCPUで非常に高速ですか?他の特定のライブラリと互換性がありますか?コンプライアンス上の理由から、特定の暗号またはその他のプリミティブを使用しますか(使用しないことを望みます)?特定の言語で利用できますか?
2020年半ばの時点でよく知られているいくつかの例については、LibSodiumまたはMonocypherを検討してください。どちらも高く評価され、レビューされ、使いやすさに重点が置かれています。他の選択肢は、NaCl、LibHydrogenなどです。これらのすべてがセキュリティ、速度、または利便性に等しく焦点を当てているわけではないことに注意してください。たとえば、TweetNaClは最小限のコードサイズを強調し、元のNaClと比較して、プロセスの速度と潜在的にある程度のセキュリティを犠牲にします。