Криптография за уеб и мобилни разработчици

21
Криптография за уеб и мобилни разработчици Владимир Джувинов * ТърновоКонф 2015 * @dzhuvinov

Upload: vladimir-dzhuvinov

Post on 16-Apr-2017

425 views

Category:

Software


4 download

TRANSCRIPT

Page 1: Криптография за уеб и мобилни разработчици

Криптография за уеб и мобилни

разработчици

Владимир Джувинов * ТърновоКонф 2015 * @dzhuvinov

Page 2: Криптография за уеб и мобилни разработчици

Шестте крипто инструмента

Генератор на случайни

числаХеш функция HMAC

Асиметрично шифриране

Симетрично шифриране

Цифров подпис

Page 3: Криптография за уеб и мобилни разработчици

Защо да се мъчим с такива неща?

За да не ни хакнат както ЦИК!

Page 4: Криптография за уеб и мобилни разработчици

Шест практични приложения

Безопасни ID-та

Потребителска верификация

Потребителски сесии без база

Шифриране на данни и

съобщения

Защитени уеб заявки, OAuth

билети

Външна потребителска автентикация

Page 5: Криптография за уеб и мобилни разработчици

1. Случайното число

Светът на криптографията се

опира на случайното число и колко

непредсказуемо е то

Page 6: Криптография за уеб и мобилни разработчици

1. Случайното число

… влиза в ширпотреба!

Page 7: Криптография за уеб и мобилни разработчици

1. Случайното число

Полезни приложения:● Непредсказуеми

идентификатори● CSRF защита

Внимаваме за:● Ентропия на семенцата● Достатъчно дъъъъъъъъълго

ли ни е случайното число?● Периодично презасяване

import java.security.SecureRandom;

byte[] random = new byte[16];

SecureRandom.getInstance("SHA1PRNG").nextBytes(random);

Page 8: Криптография за уеб и мобилни разработчици

2. Хеш функция

Криптографската хеш функция е като

еднопосочна улица. Връщането назад не е желателно. Който все пак успее печели един

биткойн :-)

Page 9: Криптография за уеб и мобилни разработчици

2. Хеш функция

Полезни приложения:● За проверка че не са ни барали

данните в съхраниение / съобщенията в транзит

● За извеждане на ключове от пароли

Внимаваме за:● Ползваме достатъчно дълъг

хеш (SHA-256+) за избягване на колизии. MD5 е отживял!

● Смесваме със солчица за предпазваме от речникови атаки

import java.security.MessageDigest;

byte[] hash = MessageDigest.getInstance("SHA-256").update(saltBytes).digest("Hello world!".getBytes("UTF-8"));

Page 10: Криптография за уеб и мобилни разработчици

3. HMAC

Код за автентикация и проверка целостта

на данна или съобщение. Кодът

се генерира и проверява с таен

ключ. Не, това не е електронен подпис!

HMAC = Hash-based Message Authentication Code

Page 11: Криптография за уеб и мобилни разработчици

3. HMAC

Полезни приложения:● Потвърждение на email адрес

при регистрация на потребител

● Уеб и мобилни сесии без база на сървъра

● Сигурно обвързване на заявки с обратни обаждания през браузъра (OAuth callback)

● Алтернатива на HTTP Basic автентикация, без споделяне на тайната парола

Важно:● Достатъчно дъъъъъъъълъг

ли ни е HMAC ключа? 256+ бита

● Внимаваме някой да не ни гепи HMAC ключа! Всеки който има достъп до него може да създава кодове за автентикация

● Важно: HMAC няма силата на цифров подпис!

Page 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

Page 13: Криптография за уеб и мобилни разработчици

4. JOSE / JWT

JSON заглавие Товар HMAC

{''alg'':''HS256''} Hello World! ljARfmwuxZyeQ...

eyJhbGciOiJIUzI1NiJ9.SGVsbG8gd29ybGQh.ljARfmwuxZyeQj4XpccO3Rxr_g0wmoPEEbR3F_MbIkQ

BASE64URL

Page 14: Криптография за уеб и мобилни разработчици

4. Java библиотеката за JOSE/JWT

● HMAC, RSA / EC подписи + шифриране и куп други крипто чудесии под Java

● Работи в приложения обслужващи над 70 милиона потребители в мрежата (OpenID Connect, OAuth)

● Десетки зубъри поддръжници и тестери

● 100% документирана● С отворен код и Apache 2.0

лиценз

http://connect2id.com/products/nimbus-jose-jwt

Page 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

Page 16: Криптография за уеб и мобилни разработчици

6. Цифров подпис

Доста по-функционален от

обикновения подпис. Идентифицира лицето подписало документа

и също гарантира неговата цялост.

Page 17: Криптография за уеб и мобилни разработчици

6. Цифров подпис

Полезни приложения:● Удостоверяване на

документи, токени и съобщения

● Билет за вход (OpenID Connect - Identity token)

● Билет за достъп до уеб API (OAuth 2.0 bearer access token)

Внимаваме за:● RSA ключ поне 1024 бита,

по-добре 2048● Пазим надеждно частния

клюс, с който се подписват съобщенията

● Периодично сменяме ключовете (ротация)

● Не използваме един и същ RSA / EC ключ за подписване и шифриране

Page 18: Криптография за уеб и мобилни разработчици

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())));

Page 19: Криптография за уеб и мобилни разработчици

7. Билет за вход

eyJhbGciOiJSUzI1NiJ9.eyJleHAiOjE0NDkyNTM1NjAsInN1YiI6ImFsaWNlIiwicm9sZXMiOlsiYWRtaW4iLCJhdWRpdCJdLCJpc3MiOiJodHRwczpcL1wvaWRwLndzIiwiaWF0IjoxNDQ5MjUyOTYwfQ.UqnmYNxbySpcP0vpAcW_eWDeYGnhpB6JiLX3AgbLiFIT96kaD5C0DV1A-53zDPk9GLzkFiH0Da85b9hgE7tPiApdWYAPghQ_3u5nmooixHFUqyWmz-nQogWvQU-Y0vhPCGwoAp4U1onvHfnTYecZBBf1hOwidEYsFTEhtKVVApsPoSK2fScmXjXCkRydFO3XH5unYlZvyJQ13f1FDR0iXRa6L47U1csn3dagXF0n9kEaT_I188A2XdqRe_6sTfijgEg_6B-Lot24oxau2KxCzGsUByCYqWXbYobQrirEn5-YF0E-coBHKILN2TX04oKjY6do4nsnZ322Dh23KvgiXA

JSON заглавие Товар RSASSA

{''alg'':''RS256''} { … } ljARfmwuxZyeQ...

Page 20: Криптография за уеб и мобилни разработчици

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

Page 21: Криптография за уеб и мобилни разработчици

Благодаря!

Въпроси + Отговори?