Автор Тема: Сигурна логин форма с RSA?  (Прочетена 4918 пъти)

Naka

  • Напреднали
  • *****
  • Публикации: 3395
    • Профил
Сигурна логин форма с RSA?
« -: Feb 03, 2014, 15:58 »
Имам логин система. Досега беше с Digest authentication, обаче това е доста неудобно. Не може да се контролира например pop-up прозореца дето изкача за име и парола - и е доста стряскащо за обикновеният юзер.

Варианта с веб форма за име и парола е много удобен за юзерите, може да са украси по всякакъв начин, обаче HTML-а не поддържа нищо друго освен Plain text автентификация :o

Не ми се плаща за https:// сертификат.  Данните които хвърчат по мрежата не са толкова важни че да бъдат криптирани. Интересува ме само да се изпраща криптирана парола, така че ако някой слухти по мрежата а не може да открадне паролата.
---------------------------------------------------------------

След доста мислене и четене стигнах до такова решение с обикновена web форма:

от страна на клиента (браузера):
--------------------------------
Код:
<script language="JavaScript" type="text/javascript" src="jsbn.js"></script>
<script language="JavaScript" type="text/javascript" src="rsa.js"></script>


<script language="JavaScript">

    function encryptData(){

        // Don't forget to escape the lines:
        var pem="-----BEGIN PUBLIC KEY-----\
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAz8X1t1+7xQ+hZe6NkJQ5\
ip8OE2pqduTGGyds+JQLFHhtfJ9q/GhEPUDk1vw73JPoi3mBYchHtX7KEsx0UDv6\
vMKjuato0x+CGlZ193bFs5G3BkLWsQCTiqF8XaOrEJjLxq4irpKDoWTl7qfC6XPE\
eftumqSHPv6yl0efnYmDBUAIswXZZ02oRyMokQj9sEYq4n7YdI+dTQ2SqGlS7R/6\
ojzM4/JmmkyTXpEzeFtCv1LTwxhBS1j0Lt/SIi38IgONCzE0gsxGbFpXAfToEkNO\
KdGfs7/C3rSBzSaVENAS5N1fCWSAW/byILfSwvN0/HquiUydUpe9aN3TYOkvKtjZ\
cQIDAQAB\
-----END PUBLIC KEY-----";

        var key = RSA.getPublicKey(pem);

        element=document.getElementById('password');

        element.value=RSA.encrypt(element.value, key);

// submit the form
document.getElementById('txtAuth').action='';
document.getElementById('txtAuth').submit();
    }
</script>

<form action="javascript:void(0);" method='POST' id='txtAuth' onsubmit='encryptData()'>
    <input type='text' name='username'/><BR>
    <input type='password' name='password' id='password' placeholder="password"/><BR>
    <INPUT type="hidden" name="nonce" value="qwvfjpopdsw">
    <input type='submit' name='button' value='Submit'>
</form>

От страна на сървера:
--------------------------------
Код:
// Load private key:
$private = @file_get_contents('include-dir/rsa/KEYS/key.pem');
if (false === $private) die("Can't read private key");
if (! $privateKey = openssl_pkey_get_private($private)) die('Loading Private Key failed');

// Decrypt
$decrypted_text = '';
if (! openssl_private_decrypt(base64_decode($_POST['password']), $decrypted_text, $privateKey))
           die('Failed to decrypt data');

// Decrypted :)
//print $decrypted_text;

// Free key
openssl_free_key($privateKey);

Клиента кодира паролата с публичният ключ чрез JavaScript RSA функция  и събмитва формата. Сърверската (PHP) част декодира паролата с частният ключ и логва клиента.

Проблема е че така реализирано много лесно някой който слуша мрежата може направо да запомни цялата RSA.encrypt('passworд') стойност и да я използва за логване. Нямам идея как такава 'reply' атака се избягва, нито как го правят на практика в протоколите за  автентификация.

Това което ми идва на ума е следното:

1. генериране всеки път на нова двойка ключове- това не ме прави поради  performance проблеми.
 
2. наред с изпращането на криптираната парола да се изпраща и случайно генерирано число - 'nonce'.
'nonce'-то се генерира от сървера. Всеки път е различно и важи само един път. Клиента го препраща обратно към сървера.

RSA.encrypt('passworд') ->
                  nonce ->


Ако някой слухти и запомни цялата криптирана парола. То няма да може да използва 2-ри път защото тя си върви в 'пакет' с 'nonce' стойност.

3. 'nonce'-то да се вмъкне като под стринг в паролата:
RSA.encrypt('password:nonce') ->


Идея кой е най-правилният подход и не греша ли някъде в цялата постановка. ???
« Последна редакция: Feb 03, 2014, 16:20 от Naka »
Активен

Perl - the only language that looks the same before and after encryption.

gat3way

  • Напреднали
  • *****
  • Публикации: 6050
  • Relentless troll
    • Профил
    • WWW
Re: Сигурна логин форма с RSA?
« Отговор #1 -: Feb 03, 2014, 16:21 »
По-добре не. Replay атаката не е единствената беда, mitm атаките са по-кофти проблема. Примерно може да ти се сервира генериран от лошите публичен ключ с който ще криптираш паролата и съответно те ще я декриптират с техния частен ключ и съответно оттам нататък ще се логват с нея в истинския сайт.
Активен

"Knowledge is power" - France is Bacon

senser

  • Напреднали
  • *****
  • Публикации: 1328
    • Профил
Re: Сигурна логин форма с RSA?
« Отговор #2 -: Feb 03, 2014, 16:40 »
Най-логичното (не казвам най-доброто) решение в такава ситуация си мисля, че е https. Ако не искаш да купуваш сертификат, вариантът с недостоверен (генериран от теб примерно) такъв, не е ли решение?
Активен

gat3way

  • Напреднали
  • *****
  • Публикации: 6050
  • Relentless troll
    • Профил
    • WWW
Re: Сигурна логин форма с RSA?
« Отговор #3 -: Feb 03, 2014, 16:44 »
Само да вметна че от startssl са безплатни (за некомерсиални цели)
Активен

"Knowledge is power" - France is Bacon

kifavi8024

  • Новаци
  • *
  • Публикации: 0
    • Профил
Re: Сигурна логин форма с RSA?
« Отговор #4 -: Feb 03, 2014, 18:47 »
CAcert също дават безплатни сертификати :)
Активен

Naka

  • Напреднали
  • *****
  • Публикации: 3395
    • Профил
Re: Сигурна логин форма с RSA?
« Отговор #5 -: Feb 05, 2014, 15:25 »
По-добре не. Replay атаката не е единствената беда, mitm атаките са по-кофти проблема. Примерно може да ти се сервира генериран от лошите публичен ключ с който ще криптираш паролата и съответно те ще я декриптират с техния частен ключ и съответно оттам нататък ще се логват с нея в истинския сайт.

Това което целях е много просто. Да не може някой чрез слухтене на мрежата да докопа паролата. Т.е. да не е толкова просто за някой начинаещ хакер стоящ си вкъщи.

От друга страна за MITM атака не трябва ли да се извършва на ниво internet провайдер. Трябва някой стоящ на ключово място където минава целият трафик, да пренасочи трафика за сайта през себе си, (да пусне някакво прокси) и да ползва специални тулове.

Което ми се вижда много невероятно. За някакъв си не много известен сайт, някой ISP специално да се занимава със сайта. Още повече, че това дето го направих е нестандартно решение и да го направи някой ще трябва да си пише тулове специално за мене :o

Но ако си твърде твърде голям даже и да имаш https:// решат ли все ще се пробват и ще намерят начин.


Цитат
Само да вметна че от startssl са безплатни (за некомерсиални цели)
...
CAcert също дават безплатни сертификати

Трябва ли такъв да го има листван като CA в браузера. Всички браузери еднакви списъци ли имат?
Т.е. харесвам си някой. И трябва да проверя дали го има във всичките браузери и версии. ???

« Последна редакция: Feb 05, 2014, 15:35 от Naka »
Активен

Perl - the only language that looks the same before and after encryption.

d0ni

  • Напреднали
  • *****
  • Публикации: 183
    • Профил
Re: Сигурна логин форма с RSA?
« Отговор #6 -: Feb 05, 2014, 15:51 »
Това което целях е много просто. Да не може някой чрез слухтене на мрежата да докопа паролата. Т.е. да не е толкова просто за някой начинаещ хакер стоящ си вкъщи.

От друга страна за MITM атака не трябва ли да се извършва на ниво internet провайдер.

Ако може да ти слуша мрежата, най-вероятно ще може да действа и като MITM. Примерно ако си на wireless, ще може да ти inject-не фалшив отговор на DNS заявка и да те препрати към друг сървър, където вече да ти върне друг публичен ключ. Изобщо ми се струва, че ще си загубиш времето за някакво фалшиво чувство за сигурност. :)
Активен

gat3way

  • Напреднали
  • *****
  • Публикации: 6050
  • Relentless troll
    • Профил
    • WWW
Re: Сигурна логин форма с RSA?
« Отговор #7 -: Feb 05, 2014, 15:58 »
Мне, всеки в същия етернет сегмент спокойно може да прави mitm атаки, най-лесно чрез arp spoofing. Има и доста достъпен и лесен за ползване софтуер за целта (hunt примерно). Няма нужда доставчика да го прави, може да го прави и съседа ти.
Активен

"Knowledge is power" - France is Bacon

Naka

  • Напреднали
  • *****
  • Публикации: 3395
    • Профил
Re: Сигурна логин форма с RSA?
« Отговор #8 -: Feb 05, 2014, 16:59 »
Изобщо ми се струва, че ще си загубиш времето за някакво фалшиво чувство за сигурност. :)

Да де ама не смятам да страдам и от параноя. Та то повече от половината BG сайтове - форуми и т.н. паролите хвърчат в открит вид. Включително и linux-bg.org
Ако беше чак пък толкова сериозен проблема с хакерите то нямаше нищо да работи. Какви хакери са щом не могът и отворена парола да докопат. Пък за mitm да не говорим.

Ако някой хакер в локалната мрежа открадне нещо... то ще открадне логина на 1-2 потребители..... и какво от това? Няма да срине сайта я.


Много добре виждам къде е слабостта на този скрипт.
« Последна редакция: Feb 05, 2014, 17:04 от Naka »
Активен

Perl - the only language that looks the same before and after encryption.

gat3way

  • Напреднали
  • *****
  • Публикации: 6050
  • Relentless troll
    • Профил
    • WWW
Re: Сигурна логин форма с RSA?
« Отговор #9 -: Feb 05, 2014, 21:15 »
Ем добре де, но това важи със същата степен и ако просто пращаш паролата в чист вид. При това RSA е сигурно най-лошия вариант, защото е изключително CPU-интензивно. Тъй като ще ползваш openssl да ти генерира ключа, то най-вероятно ще ти го генерира с малка експонента - резултатът е че няма да тормозиш потребителските браузъри и всичко ще е за сметка на сървъра. Ако все пак решиш да имплементираш решението с генерирането на двойка ключове за клиент, тогава не ми се мисли. По-лесно е просто да го минеш през някакъв хеш алгоритъм в javascript-а.
Активен

"Knowledge is power" - France is Bacon

d0ni

  • Напреднали
  • *****
  • Публикации: 183
    • Профил
Re: Сигурна логин форма с RSA?
« Отговор #10 -: Feb 06, 2014, 00:38 »
А защо не ползваш openid и логването да става през google или yahoo, например?
Активен

gat3way

  • Напреднали
  • *****
  • Публикации: 6050
  • Relentless troll
    • Профил
    • WWW
Re: Сигурна логин форма с RSA?
« Отговор #11 -: Feb 06, 2014, 01:18 »
Цитат
Ако може да ти слуша мрежата, най-вероятно ще може да действа и като MITM.

Това между другото е ужасно вярно. Хората трябва да си го набият в главата, защото всеобщото разбиране е че след като би изисквало повече усилия, значи не е проблем. Проблем е и е проблем, защото открива съвсем различен тип уязвимости в цялата схема, които могат да са много по-сериозни. Примерно човек, който единствено слухти пасивно, ще трябва да подложи криптираната с RSA парола на offline атака и му пожелавам успех, защото ще отнеме доста време. Активната атака обаче попилява сигурността на схемата за секунди.

Много обичам да давам примера с GSM, просто е много добра илюстрация - пасивното слухтене е ОК стига да ти се разбива 64-битов ключ и това отнема време дори 20 години след стандартизирането на протоколите - дали ще отнеме няколко минути и няколко терабайта rainbow таблици, дали ще отнеме няколко часа GPU време, няма значение. Активната атака за сметка на това води до слухтене на разговори в реално време.
Активен

"Knowledge is power" - France is Bacon

Naka

  • Напреднали
  • *****
  • Публикации: 3395
    • Профил
Re: Сигурна логин форма с RSA?
« Отговор #12 -: Feb 07, 2014, 10:51 »
Да пофилософствам малко.

Нали асиметричната криптография е измислена да може да се предава по незащитен канал.
Да ама излиза, че въпреки това все пак е нужен и защитен канал. ::) В случая 'защитения канал' идва с браузера и това е сигурният списък с CA.

-------

Ако имаме валиден сертификат това дали ще ни защити 100%. Браузера няма да спре достъпа до компрометирания сайт а само ще предупреди. И като юзерите са свикнали навсякъде да цъкат с 'YES' и да се съгласяват с всичко. Ами то навсякъде трябва да се цъка с 'YES' и то не само по един път - при инсталации на програми... при регистрации в сайтове.. попълване на форми... и т.н.

Обикновеният юзер е обучен че ако не отговаря с 'YES' нищо няма да му тръгне :o Представете си сега че 'лошият' започне да прави съвсем обикновена mitm атака на сертифициран сайт. Сигурен съм че повече от половината юзери ще отговорят с 'Искам да продължа' ......Ами то досега винаги съм си влизал нормално......Това сега пък какво е...... Я да се маха и да не ми пречи на работа..........

Не обезсмисля ли това цялата идея и не е ли само фалшиво чувство за сигурност.

Ако не искаш да купуваш сертификат, вариантът с недостоверен (генериран от теб примерно) такъв, не е ли решение?

За външните юзери не е решение точно заради предупреждаващите прозорци дето изкачат.
Обаче смятам да го използвам само за админ акаунта. Той е отделен на собствен поддомейн и се ползва служебно само от определени компютри. Така че предупреждаващите прозорци не са изобщо проблем.
   


« Последна редакция: Feb 07, 2014, 11:00 от Naka »
Активен

Perl - the only language that looks the same before and after encryption.

gat3way

  • Напреднали
  • *****
  • Публикации: 6050
  • Relentless troll
    • Профил
    • WWW
Re: Сигурна логин форма с RSA?
« Отговор #13 -: Feb 07, 2014, 11:36 »
Цитат
Нали асиметричната криптография е измислена да може да се предава по незащитен канал.
Да ама излиза, че въпреки това все пак е нужен и защитен канал. ::) В случая 'защитения канал' идва с браузера и това е сигурният списък с CA.

И симетричната и асиметричната криптография са измислени, за да се предават данни по незащитен канал. Решенията използващи изцяло симетрична криптография изискват друг сигурен канал по който се дистрибутират ключовете и key management-а става доста комплексен проблем с повече кореспонденти. Асиметричната криптография премахва нуждата от сигурен канал за обмяна на ключовете - обаче не решава проблема с автентичността им. При https това е решено като в браузърите имаш доверени root CA сертификати, с които може да провериш веригата кой какво подписал. Ако използваш самоподписан сертификат, тогава сигурността на https се свежда точно до нивото на твоето решение с RSA публичния ключ предаден по несигурен канал

В случаят когато предаваш публичния ключ по несигурен канал, няма как да се провери автентичността му. Разбира се би могъл да предаваш сертификат, не само публичен ключ (т.е публичния ключ плюс разните там x.509 полета и това подписано от сертификатно authority от списъка с доверени такива в браузъра). Лошото е че тях пък не можеш да ги достъпиш през javascript-а, вероятно би могло с плъгин на браузъра вече, не знам.

Активен

"Knowledge is power" - France is Bacon