Първо, това НЕ подобрява сигурността на вашето приложение (ако приемем, че е уеб приложение).
Използвайте SSL (или всъщност TLS, който обикновено се нарича SSL), всъщност не е скъп (измерете времето, което използвате, за да намерите начини да го заобиколите, и го умножете по минималната заплата, закупуването на сертификат печели почти винаги).
Причината за това е проста. TLS решава проблем (когато се използва с купени сертификати, а не самоподписани), който е доста голям в криптографията: Как да разбера, че сървърът, с който говоря, е сървърът, с който мисля, че говоря? TLS сертификатите са начин да се каже: „Аз, сертифициращият орган, доверен от вашия браузър, удостоверявам, че уебсайтът на [url] има този публичен ключ със съответния частен ключ, който (личен ключ) само сървърът знае, вижте Подписах се върху целия документ, ако някой го е променял, можете да видите".
Без TLS всяко криптиране става безсмислено, защото ако седя до вас в кафене, мога да накарам вашия лаптоп/смартфон да мисли, че аз съм сървърът, а MiTM (Man in The Middle) вас. С TLS вашият лаптоп/смартфон ще крещи „НЕДОВЕРЕНА ВРЪЗКА“, защото нямам сертификат, подписан от сертифициращ орган, който да съответства на вашия сайт. (Шифроване срещу удостоверяване).
Отказ от отговорност: потребителите са склонни да щракат точно през тези предупреждения: „Ненадеждна връзка? Какво? Искам само моите снимки на котенца! Добавяне на изключение Щракнете Потвърди Щракнете УРА! Котенца!“
Въпреки това, ако наистина не искате да закупите сертификат, все пак Въведете хеширане на javascript от страна на клиента (и използвайте standford библиотеката (SJCL) за това, НИКОГА НЕ ВНЕДРЯВАЙТЕ САМИ КРИПТО ).
Защо? Повторно използване на парола! Мога лесно да открадна сесийната ви бисквитка (която ми позволява да се преструвам пред вашия сървър, че съм вие) без HTTPS (вижте firesheep). Ако обаче добавите javascript към вашата страница за вход, който преди изпращане хешира паролата ви (използвайте SHA256 или дори по-добре използвайте SHA256, изпратете им публичен ключ, който сте генерирали, и след това шифровайте хеширана паролата с това, не можете да използвате сол с това) и след това изпраща хешираната/шифрована парола на сървъра. РЕХЕХАЙТЕ хеша на вашия сървър със сол и го сравнете с това, което се съхранява във вашата база данни (съхранявайте паролата така:
(SHA256(SHA256(password)+salt))
(запазете солта и като обикновен текст в базата данни)). И изпратете паролата си така:
RSA_With_Public_Key(SHA256(password))
и проверете паролата си така:
if SHA256(RSA_With_Private_Key(SHA256(sent_password))+salt_for_username) == stored_pass: login = ok
Защото, АКО някой надуши вашия клиент, той ще може да влезе като ваш клиент (отвличане на сесия), но НИКОГА няма да види паролата в обикновен текст (освен ако не промени вашия javascript , обаче хакерът на Starbucks вероятно няма да знае как да/се интересува от това.) Така че те ще получат достъп до вашето уеб приложение, но не и до своя имейл/фейсбук/и т.н. (за което вашите потребители вероятно ще използват една и съща парола). (Имейл адресът или ще бъде тяхното име за вход, или ще бъде намерен в техния профил/настройки на вашето уеб приложение).
person
FriendlyCryptoNeighbor
schedule
09.05.2014