Полезна криптография за уеб и мобилни разработчици - това ще бъде една от темите на ТърновоКонф утре. Без да се задълбаваме в теория, ще разгледаме основните крипто инструменти - хеш, HMAC, подпис и (а)симетричен тайнопис и техни практични приложения като верификация на потребители, single-sign on, CSRF защита, автентикация към уеб интерфейси и прочие :)
7. 1. Случайното число
Полезни приложения:
● Непредсказуеми
идентификатори
● CSRF защита
Внимаваме за:
● Ентропия на семенцата
● Достатъчно дъъъъъъъъълго
ли ни е случайното число?
● Периодично презасяване
import java.security.SecureRandom;
byte[] random = new byte[16];
SecureRandom.getInstance("SHA1PRNG").nextBytes(random);
8. 2. Хеш функция
Криптографската хеш
функция е като
еднопосочна улица.
Връщането назад не е
желателно. Който все
пак успее печели един
биткойн :-)
9. 2. Хеш функция
Полезни приложения:
● За проверка че не са ни барали
данните в съхраниение /
съобщенията в транзит
● За извеждане на ключове от
пароли
Внимаваме за:
● Ползваме достатъчно дълъг
хеш (SHA-256+) за избягване на
колизии. MD5 е отживял!
● Смесваме със солчица за
предпазваме от речникови атаки
import java.security.MessageDigest;
byte[] hash = MessageDigest
.getInstance("SHA-256")
.update(saltBytes)
.digest("Hello world!".getBytes("UTF-8"));
10. 3. HMAC
Код за автентикация
и проверка целостта
на данна или
съобщение. Кодът
се генерира и
проверява с таен
ключ. Не, това не е
електронен подпис!
HMAC = Hash-based Message Authentication Code
11. 3. HMAC
Полезни приложения:
● Потвърждение на email адрес
при регистрация на
потребител
● Уеб и мобилни сесии без база
на сървъра
● Сигурно обвързване на заявки
с обратни обаждания през
браузъра (OAuth callback)
● Алтернатива на HTTP Basic
автентикация, без споделяне
на тайната парола
Важно:
● Достатъчно дъъъъъъъълъг
ли ни е HMAC ключа?
256+ бита
● Внимаваме някой да не ни
гепи HMAC ключа! Всеки
който има достъп до него
може да създава кодове за
автентикация
● Важно: HMAC няма силата
на цифров подпис!
12. 4. JOSE / JWT
● Улеснява живота на разработчиците на уеб, JavaScript, мобилни и
IoT приложения, които се нуждаят от HMAC, цифрови подписи и
шифриране на данни и съобщения
● URL-безопасен формат (Base64URL) за предаване на защитени
обекти и токени чрез HTTP връзки, форми и заглавия
● RFC 7515, 7516, 7517, 7518, 7519, 7520
JSON заглавие Товарен отсег
HMAC / RSASSA /
ECDSA
{''alg'':''HS256''} Hello World! xxxxxxxxxxxxx
14. 4. Java библиотеката за
JOSE/JWT
● HMAC, RSA / EC подписи +
шифриране и куп други крипто
чудесии под Java
● Работи в приложения
обслужващи над 70 милиона
потребители в мрежата
(OpenID Connect, OAuth)
● Десетки зубъри поддръжници
и тестери
● 100% документирана
● С отворен код и Apache 2.0
лиценз
http://connect2id.com/products/nimbus-jose-jwt
15. 5. Код за email потвърждение
// Message: {''sub'':''alice'',''exp'':1449237518}
byte[] macKey = new byte[32];
SecureRandom.getInstance("SHA1PRNG").nextBytes(macKey);
JWTClaimsSet claims = new JWTClaimsSet.Builder()
.subject("alice")
.expirationTime(new Date(new Date().getTime() + 10*60*1000))
.build();
SignedJWT jwt = new SignedJWT(new JWSHeader(JWSAlgorithm.HS256), claims);
jwt.sign(new MACSigner(macKey));
assertTrue(jwt.verify(new MACVerifier(macKey)));
// eyJhbGciOiJIUzI1NiJ9.SGVsbG8gd29ybGQh.Dby-zS1BF21apXtsukTokzcU22dbXT38hx2H-R2A3G8
16. 6. Цифров подпис
Доста по-
функционален от
обикновения подпис.
Идентифицира лицето
подписало документа
и също гарантира
неговата цялост.
17. 6. Цифров подпис
Полезни приложения:
● Удостоверяване на
документи, токени и
съобщения
● Билет за вход (OpenID
Connect - Identity token)
● Билет за достъп до уеб
API (OAuth 2.0 bearer
access token)
Внимаваме за:
● RSA ключ поне 1024 бита,
по-добре 2048
● Пазим надеждно частния
клюс, с който се подписват
съобщенията
● Периодично сменяме
ключовете (ротация)
● Не използваме един и същ
RSA / EC ключ за
подписване и шифриране