Звичайний текстовий пароль через HTTPS


93

Зараз я працюю над постачальником PHP OpenID, який буде працювати через HTTPS (отже, зашифрований SSL).
Чи неправильно мені передавати пароль як звичайний текст? Теоретично HTTPS не може бути перехоплений, тому я не бачу нічого поганого. Або це небезпечно на якомусь рівні, і я не бачу цього?

Відповіді:


129

Це безпечно. Ось так працює вся мережа. Усі паролі у формах завжди надсилаються у вигляді простого тексту, тому HTTPS має захистити його.


20
Незначний шум: деякі форми для входу використовують JavaScript для хешування пароля, а не надсилання йому простого тексту.
Торарін,

5
@Thorarin, якщо вони справді хешують його, це означає, що сервер зберігає пароль у звичайному тексті, щоб він міг хеш з тією ж сіллю для перевірки. Ік! Надіслати пароль у ssl-тексті краще, оскільки серверу не потрібно зберігати пароль у звичайному тексті.
DGM

11
@DGM: подвійне хешування також є варіантом, тому паролі простого тексту не є суворо необхідними.
Торарін,

3
@Denis: хешування на стороні клієнта насправді не надто допомагає. Це може зробити щось складніше, ніж звичайний текст, але той, хто дійсно хоче вкрасти пароль, може зробити це без проблем. Безпечно буде працювати, лише якщо ви надішлете принаймні одноразовий маркер по захищеному каналу (ssl), і в цьому випадку ви можете просто надіслати пароль у SSL для початку.
Eduardo Scoz

4
Я просто кажу, що Yahoo вважав, що хешування на стороні клієнта є достатньо безпечним, поки вони не зможуть дозволити собі перейти до ssl. Але привіт, я все за https :)
Денис

74

Вам все одно потрібно переконатися, що ви надсилаєте його через запит POST, а не GET. Якщо ви надішлете його через запит GET, він може бути збережений у відкритому тексті в журналах історії браузера користувача або журналах доступу веб-сервера.


7
Так, я це знав, але все ж хороший коментар залишити позаду для інших, хто приходить сюди шукати. :)
WhyNotHugo

або надішліть його в шапці
Джеймс

22

Якщо HTTP вимкнено, а ви використовуєте лише HTTPS, тоді ви насправді не передаєте пароль як звичайний текст.


4
Однак сервер робить доступ до вашого відкритого тексту пароля, вони можуть зберегти його як звичайний текст, журнал це неправильно , як відкритий текст і т.д. Тобто, ваш пароль не залишається на боці клієнта, сервер також бачить саме те , що він є.
xref

14

Хеш на стороні клієнта. Чому? Дозвольте розповісти вам про невеликий експеримент. Підійдіть до комп’ютера в їдальні компанії. Відкрийте браузер на сторінці входу на веб-сайт компанії (https). Натисніть клавішу F12, клацніть вкладку мережі, поставте галочку біля журналу збереження, згорніть консоль, але залиште веб-сторінку відкритою для входу в систему. Сідайте і їжте обід. Подивіться, як працівник після того, як працівник входить на веб-сайт компанії, і як хороший маленький працівник виходить із системи, коли це робить. Закінчіть обід, сядьте за комп’ютер, відкрийте вкладку мережі та перегляньте кожне ім’я користувача та пароль у вигляді простого тексту у формі тіла.

Ніяких спеціальних інструментів, ніяких спеціальних знань, жодного вишуканого обладнання для злому, ніяких кейлогерів просто старий добрий F12.

Але привіт, продовжуйте думати, все, що вам потрібно - це SSL. Погані хлопці будуть вас за це любити.


6
Ваш коментар у їдальні не має жодного сенсу, хоч би скільки я його перечитував. Чому люди просто підходять до комп’ютера і вводять свої дані? Що ви намагаєтеся довести? Крім того, хешування в жодному разі не зробить це більш небезпечним. Звичайно було хешувати паролі та передавати їх за допомогою простого тексту HTTP, коли це питання було написано в 2009 році.
WhyNotHugo

4
Я upvoted обидва з них , тому що, так, прийнятий відповідь буде читається багато років по тому. Було б непогано, якщо б @CodeDog просив вказати на якусь стратегію пом’якшення наслідків. І так, люди просто підійдуть до випадкових ПК, наприклад, у місцевій бібліотеці, і вкажуть свої дані!
JoeAC

3
Я шифрую паролі на стороні клієнта за допомогою відкритого ключа, а потім публікую у формі лише зашифрований пароль. Це асиметричний ключ, тому відкритий ключ на стороні клієнта марний для зловмисників. Кожен журнал генерує нову пару ключів, тому атаки відтворення теж не працюють. Ключ навіть змінюється при невдалих спробах входу. Пари ключів генеруються на стороні сервера, коли користувачі переходять на екран входу. Коду на стороні клієнта надається лише відкритий ключ.
CodeDog

До речі, я бачив, як цей хакер використовується персоналом готельного бізнес-центру для збору паролів для номерів номерів. Вони скористалися б паролем для підключення до бездротової мережі та використання комп’ютерів бізнес-центру, і він виставлявся б у номер.
CodeDog

Я сам здійснив такий експеримент, зареєструвавшись на своєму банківському рахунку, і повинен погодитися з @CodeDog - Запит на корисне навантаження включає мій логін та пароль, як відкритий текст.
Артур Міхайлук

6

Давайте зробимо кілька приміток до попередніх відповідей.

По-перше, це, мабуть, не найкраща ідея використовувати хеш-алгоритми на стороні клієнта. Якщо ваш пароль посолений на стороні сервера, ви не зможете порівнювати хеші (принаймні ні, якщо ви не зберігаєте хеш-пам'ять клієнта в базі даних в одному з шарів хешування від пароля, який є однаковим або гірше). І ви не хочете реалізовувати алгоритм хешування, який використовується базою даних на стороні клієнта, це було б безглуздо.

По-друге, торгівля криптографічними ключами теж не є ідеальною. Теоретично MITM може (враховуючи, що на клієнті встановлений кореневий сертифікат) змінити криптографічні ключі та змінити за допомогою власних ключів:

Оригінальне з'єднання (не враховуючи tls) з теоретичного сервера, який обмінюється ключами:

Запит клієнта відкриті ключі> сервер містить приватні ключі, генерує відкриті ключі клієнту> сервер надсилає відкриті ключі клієнту

Тепер, у теоретичному нападі на MITM:

Запит клієнта на відкриті ключі> MITM генерує підроблені приватні ключі > Сервер утримує приватні ключі, генерує відкриті ключі для клієнта> MITM отримує відкриті ключі від оригінального сервера, тепер ми можемо відправити наші підроблені відкриті ключі клієнту, і кожного разу, коли запит надходить від клієнта, ми будемо розшифровувати дані клієнта за допомогою підроблених ключів, змінювати корисне навантаження (або читати його) та шифрувати оригінальними відкритими ключами > MITM надсилає підроблені відкриті ключі клієнту.

У цьому полягає сенс довіри сертифіката ЦС у TLS, і саме так ви отримуєте повідомлення від попередження браузера, якщо сертифікат недійсний.

У відповідь на ОП: на мою скромну думку, ви не можете цього зробити, тому що рано чи пізно хтось захоче напасти на користувача із вашої служби і спробує порушити ваш протокол.

Однак ви можете застосувати 2FA, щоб люди не намагалися ввійти з тим самим паролем. Однак пам’ятайте про повторні атаки.

Я не чудовий з криптографією, будь ласка, виправте мене, якщо я помиляюся.


Майте на увазі, що ця дискусія ведеться з 2009 року. Це були майже найкращі практики на той час.
WhyNotHugo

3
@WhyNotHugo Я знаю. Я вирішив залишити відповідь, тому що найкраща відповідь Google на це питання привела мене сюди, то чому б і ні.
Лукка Феррі,

4

Інші плакати правильні. Тепер, коли ви використовуєте SSL для шифрування передачі пароля, переконайтеся, що ви хешуєте його з хорошим алгоритмом і соллю, щоб він також був захищений, коли він у спокої ...


Так, я це розумію, дякую, я мав на увазі лише передачу тут.
WhyNotHugo

0

Приклад @CodeDog має проблеми ..

Так, я можу повірити, що користувачі увійдуть у вікно з кафе. Якщо ви захоплюєте журнали з корпоративної кафетерії, то ви є порушенням безпеки. Корпоративні ящики для кафе можна відключити, наприклад, відсутність термінів, відсутність реєстраторів, відсутність віддаленого доступу тощо. Щоб запобігти вам, внутрішній хакер.

Прикладом є хороший приклад захисту комп'ютерного доступу, який насправді не пов'язаний з безпекою мережі. Це надається як виправдання хешування на стороні клієнта, але якщо у вас є доступ до комп’ютера, ви можете просто використовувати реєстратор натискань клавіш і обійти це. Хеш клієнтської сторони знову не має значення. Приклад @CodeDog - це злом доступу до комп’ютера, який вимагає прийомів, відмінних від злому мережевого рівня.

Крім того, загальнодоступний комп’ютерний захист захищений шляхом каліцтва системи від загроз, як уже згадувалося вище. наприклад, використовувати хромбук для загальнодоступного комп’ютера з кафе. Але це обходить фізичний злом. У неробочий час заходьте до кафетерії та налаштовуйте секретну камеру для запису натискань клавіатури користувачами. Тоді не має значення, якщо комп'ютер з кафетерією скалічений, АБО який тип шифрування використовується.

фізичний рівень -> рівень комп'ютера -> рівень клієнта -> рівень мережі -> рівень сервера

Для мереж не має значення, якщо у вас хеш на стороні клієнта, оскільки рівень https / ssl буде шифрувати звичайний пароль. Отож, як зазначають інші, хешування клієнта надлишкове, якщо TLS захищений.


1
Хоча ви висловлюєте хороші зауваження, ви відповідаєте на відповідь (яка сама по собі не має відношення до заданого питання), тому насправді не підходить для моделі запитань та відповідей Stackoverflow.
Мартін
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.