Как да предавате сигурно големи данни между сървър и клиент (android)?

Използвайки RSA и AES (Hybrid) техника за криптиране

Здравейте момчета,

Повечето пъти предаваме чувствителни данни от нашето приложение за Android на нашия сървър. Такива чувствителни данни могат да бъдат лично съобщение, което един потребител изпраща на друг, може да бъде информация за потребителя, може да бъде SMS на потребителя и т.н., и така нататък. Въпреки че винаги трябва изрично да информираме потребителите, преди да прехвърлим такива чувствителни данни, но също така трябва да се уверим, че прехвърляме тези данни възможно най-сигурно.

Не бива да ви изненадва, че компаниите са изправени пред огромни финансови загуби поради лоша сигурност, а това доведе и до спиране на компаниите. Друг сюрприз е, че прилагането на това изобщо не е сложно! С малко познания можете да създадете стабилна сигурност за комуникацията между клиента и сървъра.

ABC на шифроване

Помислете, че имате чувствителна информация, например имейл идентификатор на потребителя. Искате безопасно да го прехвърлите на вашия сървър. Как ще го направите? Хм .. един от начините би могъл да бъде криптирането му с помощта на парола. Клиентът ще използва този паролен код, за да шифрова имейл адреса на потребителя и да го изпрати до сървъра. Сървърът от своя страна ще използва един и същ паролен код за декриптиране на данните, получени от клиента. Ако по време на предаването на данните някой получи достъп до предаващите данни, той / тя няма да може да го осмисли, тъй като е криптиран. Освен това, тъй като нарушителят няма достъп до парола, той / тя няма да може да дешифрира данните.

Този вид техника на криптиране се нарича симетрично криптиране. Той е бърз и може да шифрова големи текстове от данни. Недостатъкът включва безопасно разпределение на ключа. Освен това трябва да доставите ключа в приложението си - което е силно не препоръчана практика. Най-популярните симетрични алгоритми са DES, Triple-DES, AES, Blowfish, RC2, RC4 (ARCFOUR), RC5, RC6.

Хм, това е проблем. Не можете да изпратите парола в приложението си. Ако натрапникът получи достъп до вашия парола, той / тя може лесно да получи всички чувствителни данни, които ще бъдат предавани от приложението ви.

Какво да правим сега? Ами ако имаше техника за криптиране, при която алгоритъмът ще генерира двойка ключове за вас, състояща се от 2 ключа. 1 публичен ключ и 1 частен ключ. Публичният ключ е видим публично и всеки може да го използва за криптиране на чувствителни данни. Но сега дешифрирането на тези данни може да се извърши само чрез частен ключ, до който имате само достъп. Еха! Това означава, че можете безопасно да изпратите публичен ключ в приложението си и да запазите частния ключ на сървъра. Това е просто прекрасно!

Този вид техника на криптиране се нарича асиметрично криптиране. Той е сравнително бавен и може да криптира само много малки текстове от данни наведнъж (128 байта, за да бъдем точни!). Най-популярните асиметрични алгоритми (известни още като алгоритми на публичния ключ) са RSA, Diffie-Hellman, ElGamal, DSS.

Така че сега е ясно, че не можете да използвате симетрично криптиране, защото не можете да изпратите парола в приложението си. Освен това е непрактично да използвате асиметрично криптиране, тъй като 99% от пъти пъти данните, които искате да прехвърлите, биха били с размер над 128 байта! Какво да правя?

Хибридно решение за спасяването!

Помислете за това:

  1. Използвайки асиметрично криптиране (да кажем RSA), сървърът генерира двойка ключове, състояща се от публичен ключ и частен ключ.
  2. Сървърът запазва тези ключове на сигурно място.
  3. Взимаме публичен ключ и го изпращаме в нашето приложение (клиент).
  4. Когато искаме да прехвърлим някои чувствителни данни към сървъра (по време на изпълнение), ние генерираме парола (известен още като секретен ключ), използвайки симетрично криптиране (да речем AES).
  5. Използвайки този секретен ключ, ние криптираме нашите големи текстове от данни бързо.
  6. Сега използваме публичния ключ за криптиране на нашия секретен ключ.
  7. Изпращаме тази криптирана информация и криптирана комбинация от секретни ключове до сървъра (използвайки всеки често използван начин за изпращане на комбинация от данни, като JSON)
  8. Сървърът получава тази комбинация, извлича криптирани данни и криптиран секретен ключ от нея.
  9. Сървърът използва частен ключ за декриптиране на криптирания секретен ключ.
  10. Сървърът използва декриптиран секретен ключ (или просто наречен секретен ключ), за да декриптира криптираните данни. Оттук се получават големите текстове от данни, изпратени от клиента сигурно.

Тази техника се нарича хибридна криптография.

Покажете ми кода!

  1. На първо място сървърът трябва да генерира ключова двойка, използвайки RSA. Това ще стане чрез следния клас: (Обърнете внимание, че този код трябва да се стартира само 1 път, тъй като ще използвате една и съща двойка ключове напред)

2. От страна на клиента, за генериране на секретен ключ по време на изпълнение, криптиране на чувствителен низ чрез секретен ключ и криптиране на секретен ключ с публичен ключ, този клас ще ви помогне:

3. След получаване на криптирания текст и криптиран секретен ключ от страната на сървъра, сървърът ще дешифрира криптирания секретен ключ, като използва частен ключ. След това сървърът ще извлече оригиналния текст, предаден от клиента, като декриптира шифрования текст с помощта на секретен ключ (дешифриран). Следният клас ще ви помогне в същото:

заключение

Приятели, както видяхте, че е парче торта, за да приложите това решение. Това не само ще спаси приложението ви от натрапници, но и ще увеличи доверието на потребителите на вашето приложение. Запомнете: Това не е функция, която предоставяте на потребителите на приложението си, а отговорност, която изпълнявате, дължите на всички тях.

Бонус намек
Както можете да видите, ние сме използвали методи на клас Base64 в горните фрагменти на кода, понякога поради разлика в изпълнението импортирането по подразбиране може да импортира малко различни файлове (android има модифицирана версия). Тук можете да намерите правилния файл, който можете да импортирате от страничния код на вашия сървър, така че клиентът и сървърът да работят в хармония :)

Вижте всички топ статии на blog.mindorks.com