Криптография за уеб и мобилни
разработчици
Владимир Джувинов * ТърновоКонф 2015 * @dzhuvinov
Шестте крипто инструмента
Генератор на случайни
числаХеш функция HMAC
Асиметрично шифриране
Симетрично шифриране
Цифров подпис
Защо да се мъчим с такива неща?
За да не ни хакнат както ЦИК!
Шест практични приложения
Безопасни ID-та
Потребителска верификация
Потребителски сесии без база
Шифриране на данни и
съобщения
Защитени уеб заявки, OAuth
билети
Външна потребителска автентикация
1. Случайното число
Светът на криптографията се
опира на случайното число и колко
непредсказуемо е то
1. Случайното число
… влиза в ширпотреба!
1. Случайното число
Полезни приложения:● Непредсказуеми
идентификатори● CSRF защита
Внимаваме за:● Ентропия на семенцата● Достатъчно дъъъъъъъъълго
ли ни е случайното число?● Периодично презасяване
import java.security.SecureRandom;
byte[] random = new byte[16];
SecureRandom.getInstance("SHA1PRNG").nextBytes(random);
2. Хеш функция
Криптографската хеш функция е като
еднопосочна улица. Връщането назад не е желателно. Който все пак успее печели един
биткойн :-)
2. Хеш функция
Полезни приложения:● За проверка че не са ни барали
данните в съхраниение / съобщенията в транзит
● За извеждане на ключове от пароли
Внимаваме за:● Ползваме достатъчно дълъг
хеш (SHA-256+) за избягване на колизии. MD5 е отживял!
● Смесваме със солчица за предпазваме от речникови атаки
import java.security.MessageDigest;
byte[] hash = MessageDigest.getInstance("SHA-256").update(saltBytes).digest("Hello world!".getBytes("UTF-8"));
3. HMAC
Код за автентикация и проверка целостта
на данна или съобщение. Кодът
се генерира и проверява с таен
ключ. Не, това не е електронен подпис!
HMAC = Hash-based Message Authentication Code
3. HMAC
Полезни приложения:● Потвърждение на email адрес
при регистрация на потребител
● Уеб и мобилни сесии без база на сървъра
● Сигурно обвързване на заявки с обратни обаждания през браузъра (OAuth callback)
● Алтернатива на HTTP Basic автентикация, без споделяне на тайната парола
Важно:● Достатъчно дъъъъъъъълъг
ли ни е HMAC ключа? 256+ бита
● Внимаваме някой да не ни гепи HMAC ключа! Всеки който има достъп до него може да създава кодове за автентикация
● Важно: HMAC няма силата на цифров подпис!
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
4. JOSE / JWT
JSON заглавие Товар HMAC
{''alg'':''HS256''} Hello World! ljARfmwuxZyeQ...
eyJhbGciOiJIUzI1NiJ9.SGVsbG8gd29ybGQh.ljARfmwuxZyeQj4XpccO3Rxr_g0wmoPEEbR3F_MbIkQ
BASE64URL
4. Java библиотеката за JOSE/JWT
● HMAC, RSA / EC подписи + шифриране и куп други крипто чудесии под Java
● Работи в приложения обслужващи над 70 милиона потребители в мрежата (OpenID Connect, OAuth)
● Десетки зубъри поддръжници и тестери
● 100% документирана● С отворен код и Apache 2.0
лиценз
http://connect2id.com/products/nimbus-jose-jwt
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
6. Цифров подпис
Доста по-функционален от
обикновения подпис. Идентифицира лицето подписало документа
и също гарантира неговата цялост.
6. Цифров подпис
Полезни приложения:● Удостоверяване на
документи, токени и съобщения
● Билет за вход (OpenID Connect - Identity token)
● Билет за достъп до уеб API (OAuth 2.0 bearer access token)
Внимаваме за:● RSA ключ поне 1024 бита,
по-добре 2048● Пазим надеждно частния
клюс, с който се подписват съобщенията
● Периодично сменяме ключовете (ротация)
● Не използваме един и същ RSA / EC ключ за подписване и шифриране
7. Билет за вход
{ ''iss'':''https://idp.ws'', ''sub'':''alice'', ''iat'':1449237518, ''exp'':1449275518, ''roles'':[''admin'',''audit''] }
import java.security.*;import java.security.interfaces.*.import com.nimbusds.jose.*;import com.nimbusds.jose.crypto.*;
KeyPairGenerator rsaGen = KeyPairGenerator.getInstance("RSA");rsaGen.initialize(2048);KeyPair rsaKeys = rsaGen.generateKeyPair();
JWTClaimsSet claims = new JWTClaimsSet.Builder() .issuer("https://idp.ws") .subject("alice") .issueTime(new Date()) .expirationTime(new Date(new Date().getTime() + 10*60*1000)) .claim("roles", Arrays.asList("admin", "audit")) .build();
SignedJWT jwt = new SignedJWT(new JWSHeader(JWSAlgorithm.RS256), claims);jwt.sign(new RSASSASigner((RSAPrivateKey) rsaKeys.getPrivate()));
assertTrue(jwt.verify(new RSASSAVerifier((RSAPublicKey) rsaKeys.getPublic())));
7. Билет за вход
eyJhbGciOiJSUzI1NiJ9.eyJleHAiOjE0NDkyNTM1NjAsInN1YiI6ImFsaWNlIiwicm9sZXMiOlsiYWRtaW4iLCJhdWRpdCJdLCJpc3MiOiJodHRwczpcL1wvaWRwLndzIiwiaWF0IjoxNDQ5MjUyOTYwfQ.UqnmYNxbySpcP0vpAcW_eWDeYGnhpB6JiLX3AgbLiFIT96kaD5C0DV1A-53zDPk9GLzkFiH0Da85b9hgE7tPiApdWYAPghQ_3u5nmooixHFUqyWmz-nQogWvQU-Y0vhPCGwoAp4U1onvHfnTYecZBBf1hOwidEYsFTEhtKVVApsPoSK2fScmXjXCkRydFO3XH5unYlZvyJQ13f1FDR0iXRa6L47U1csn3dagXF0n9kEaT_I188A2XdqRe_6sTfijgEg_6B-Lot24oxau2KxCzGsUByCYqWXbYobQrirEn5-YF0E-coBHKILN2TX04oKjY6do4nsnZ322Dh23KvgiXA
JSON заглавие Товар RSASSA
{''alg'':''RS256''} { … } ljARfmwuxZyeQ...
7. Билет за вход
https://my-cool-app.com/login?id_token=eyJhbGciOiJSUzI1NiJ9.eyJleHAiOjE0NDkyNTM1NjAsInN1YiI6ImFsaWNlIiwicm9sZXMiOlsiYWRtaW4iLCJhdWRpdCJdLCJpc3MiOiJodHRwczpcL1wvaWRwLndzIiwiaWF0IjoxNDQ5MjUyOTYwfQ.UqnmYNxbySpcP0vpAcW_eWDeYGnhpB6JiLX3AgbLiFIT96kaD5C0DV1A-53zDPk9GLzkFiH0Da85b9hgE7tPiApdWYAPghQ_3u5nmooixHFUqyWmz-nQogWvQU-Y0vhPCGwoAp4U1onvHfnTYecZBBf1hOwidEYsFTEhtKVVApsPoSK2fScmXjXCkRydFO3XH5unYlZvyJQ13f1FDR0iXRa6L47U1csn3dagXF0n9kEaT_I188A2XdqRe_6sTfijgEg_6B-Lot24oxau2KxCzGsUByCYqWXbYobQrirEn5-YF0E-coBHKILN2TX04oKjY6do4nsnZ322Dh23KvgiXA
Фирмен абонат(MS-AD/LDAP)
ПриложениеHTTP пренасочване
ID token
Благодаря!
Въпроси + Отговори?