Привет!
Несмотря на набирающие все большую популярность мобильные мессенджеры, такие как WhatsApp и Telegram, старые добрые SMS все еще не теряют свою актуальность. SMS можно использовать для отправки разного рода уведомлений, для двухфакторной аутентификации или при сбросе пароля. Однако последние успешные атаки на мобильные сети заставляют задуматься о дополнительном уровне защиты передаваемых с помощью SMS данных.
В этой статье мы поговорим о том, как используя сервисы Virgil и Twilio, сделать процесс отправки SMS на Android устройства безопасным.
Прежде чем приступать к программированию в очередной раз напомним о ряде предварительных действий.
Для отправки SMS мы будем использовать Twilio API, для доступа к которому необходимо создать Twilio аккаунт тут. После регистрации вы получите специальные идентификаторы, необходимые для работы с API — TWILIO_ACCOUNT_SID и TWILIO_AUTH_TOKEN.
Чтобы зашифровать SMS сообщения нам потребуется помощь Virgil Crypto Library и Virgil Keys Service, для доступа к которому необходимо создать Virgil аккаунт и сгенерировать специальный токен VIRGIL_ACCESS_TOKEN.
После выполнения вышеперечисленных шагов можно приступать к реализации SMS уведомлений.
Сервисы Virgil имеют большой набор SDK, позволяющих работать с ними практически на любом популярном языке программирования. В предыдущих статьях мы показывали как работать с сервисами с помощью JavaScript. Сегодня, в качестве разнообразия, мы покодим на C#.
Распишем процесс отправки и получения зашифрованных SMS поэтапно.
- Устанавливаем Virgil и Twilio SDK, используя менеджер пакетов NuGet:
PM> Install-Package 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 аккаунта, которые можно найти здесь.
- Реализуем отправку зашифрованных сообщений с помощью обычного POST запроса к сервису Twilio (отсылаем приглашения с паролями для входа на вечеринку):
// Подготовим список получателей 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 для .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 становится простой задачей, не требующей глубоких знаний в области криптографии.
P.S.
Скачать исходный код, реализующий отпраку зашифрованных SMS, вы можете на GitHub.
Автор: Virgil Security, Inc.