こんにちは、Habr!
WhatsAppやTelegramなどのモバイルメッセンジャーの人気が高まっているにもかかわらず、古き良きSMSの関連性は失われません。 SMSは、2要素認証またはパスワードのリセット時に、さまざまな種類の通知を送信するために使用できます。 しかし、最近のモバイルネットワークへの攻撃の成功により、SMSを介して送信されるデータに対する追加の保護レベルを考えています。
この記事では、VirgilおよびTwilioサービスを使用して、AndroidデバイスにSMSを送信するプロセスを安全にする方法について説明します。
プログラミングを開始する前に、いくつかの予備ステップをもう一度思い出します。
SMSを送信するには、 ここで Twilioアカウントを作成する必要があるアクセスのためにTwilio APIを使用します 。 登録後、APIの操作に必要な特別な識別子TWILIO_ACCOUNT_SIDおよびTWILIO_AUTH_TOKENを受け取ります。
SMSメッセージを暗号化するには、 Virgilアカウントを作成し、特別なトークンVIRGIL_ACCESS_TOKENを生成する必要があるVirgil Crypto LibraryとVirgil Keys Serviceの助けが必要です。
上記の手順を完了したら、SMS通知の実装に進むことができます。
Virgilサービスには、ほとんどの一般的なプログラミング言語で使用できるSDKの大きなセットがあります。 前の記事で、JavaScriptを使用してサービスを操作する方法を示しました。 今日、変更のために、 C#で投稿します。
暗号化されたSMSを送受信するプロセスを段階的に説明します。
- NuGetパッケージマネージャーを使用してVirgilとTwilio SDKをインストールします。
PM>インストールパッケージVirgil.SDK
PM> Install-Package Twilio
- VirgilおよびTwilio APIで動作するようにクライアントを初期化します。
// Twilio string accountSid = "%TWILIO_ACCOUNT_SID%"; string authToken = "%TWILIO_AUTH_TOKEN%"; // Twilio API var twilio = new TwilioRestClient(accountSid, authToken); // Virgil , var virgil = ServiceHub.Create("%VIRGIL_ACCESS_TOKEN%");
変数accountSidおよびauthTokenに注意してください。 それらには、 ここにあるTwilioアカウントの識別子を示しています 。
- Twilioサービスへの通常のPOSTリクエストを使用して、暗号化されたメッセージの送信を実装します(パーティーに参加するためのパスワード付きの招待状を送信します)。
// SMS var people = new Dictionary<string,string>() { {"+14XXXXXXXX1","Darth Vader"}, {"+14XXXXXXXX2","Luke Skywalker"}, {"+14XXXXXXXX3","Princess Leia"} }; // Virgil Keys Service var peopleCards = await Task.WhenAll(people .Select(it => virgil.Cards.Search(number))); foreach (var personCards in peopleCards) { // , var personCard = personCards.OrderBy(it => it.CreatedAt).Last(); var personName = people[personCard.Identity.Value]; // , // ( ). using (var tinyCipher = new VirgilTinyCipher(120)) { var message = $"Hey {personName}, your security word is STAR. We are waiting for you!"; var messageData = Encoding.UTF8.GetBytes(message); tinyCipher.Encrypt(messageData, personCard.PublicKey.Value); // , , SMS // 160- (120 base64 ). for(int index = 0; index < tinyCipher.GetPackageCount(); index++) { var encryptedMessage = Convert.ToBase64String(tinyCipher.GetPackage(index)); // Twilio API twilio.SendMessage( SMS.Constants.TwilioPhoneNumber, // , Twilio SMS personCard.Identity.Value, // encryptedMessage); } } }
- 受信者側でメッセージを解読します。 SMSを受信するには、Android SMS APIを使用します。 メッセージを復号化するには、Virgil SDK for .NETも必要です。
// , 120 . var tinyCipher = new VirgilTinyCipher(120); // message private void OnSmsReceived(string from, string message) { // , // , . this.tinyCipher.AddPackage(Convert.FromBase64String(message)); if (this.tinyCipher.IsPackagesAccumulated()) { var decryptedData = this.tinyCipher.Decrypt(this.myPrivateKey); var decryptedMessage = Encoding.UTF8.GetString(decryptedData, 0, decryptedData.Length); this.tinyCipher.Reset(); Application.Current.MainPage.DisplayAlert($"From: {from}", decryptedMessage, "Got It"); } }
TwilioとVirgil APIでわかるように、暗号化されたSMSの送受信は、暗号化の深い知識を必要としない単純なタスクになります。
PS
GitHubで暗号化されたSMSの送信を実装するソースコードをダウンロードできます。