Чи вистачає "якщо пароль == XXXXXXX" для мінімальної безпеки?


20

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

if(enteredPassword == verifiedPassword)
     SendToRestrictedArea();
else
     DisplayPasswordUnknownMessage();

Здається, це легко бути ефективним, але я, звичайно, не заперечував би, якби це було все, що потрібно. Чи достатньо простої перевірки імені користувача / пароля?

Оновлення: конкретний проект є веб-службою, перевірка повністю стоїть на сервері, і не є відкритим кодом. Чи змінюється домен, як ви з цим вирішили?


3
залежить, звідки походить дійснийPassword? якщо він жорстко закодований, ви не зможете налаштувати / змінити пароль без зміни коду. Якщо він походить з файла конфігурації, він буде видимий для всіх, хто має доступ до цього.
Альб

1
"Чи достатньо перевірити ім'я користувача / пароль комбінованим", щоб зробити що?
Кріс

3
@opinion: здається, малоймовірно, що це КОРОБ, ніж не мати входу. Наведіть, будь ласка, кілька міркувань для такої вагомої претензії.
Морган Херлокер

1
Ваша термінологія невірна, коли ви порівнюєте пароль із своїм підтвердженням, не переконуючись у його дійсності. Будь ласка, знайдіть час, щоб зрозуміти різницю.
billy.bob

1
Це означає просто зберігання текстового пароля, що є безвідповідальним. Це також передбачає оповіщення користувача про те, що пароль був неправильним, що надає потенційному зловмисникові занадто багато інформації. Ви завжди повинні бути неоднозначними, тобто "Невірна реєстрація або пароль".
Рейн Генріхс

Відповіді:


26

Не без SSL

Це не є безпечним, якщо пароль надсилається по мережі простим текстом. Зберігання пароля на стороні сервера також не є безпечним, якщо пароль надсилається по мережі в простому тексті.

Оскільки <input type="password"/>тег HTML надсилає його вміст у простому тексті, це буде проблемою, незалежно від того, як ви зберігаєте пароль на сервері, якщо ваш веб-сайт не використовує SSL для передачі пароля.

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

Ні, якщо адміністратори сайтів підозрюються

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

Спосіб, що захищає паролі від адміністратора

Один безпечний спосіб зберігання та перевірки паролів:

def change_password user, new_password
  salt = random(65536).to_s(16) #will be 4 characters long
  password_hash = salt + hash(salt + new_password)
  store(user,password_hash)
end

def does_password_match? user, entered_password
  correct_password_hash = retrieve(user)
  salt = correct_password_hash[0...4]
  entered_password_hash = salt + hash(salt + entered_password)
  return correct_password_hash == entered_password_hash
end

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

Залежно від середовища, в якому ви перебуваєте, від мінливості вашої затримки в мережі та від того, чи призначені публічно відомі імена користувачів, вам може знадобитися інший розрахунок шляху коду, hash('0000'+entered_password)якщо користувача не існує, щоб запобігти появі зловмисників визначаючи, які імена користувачів є дійсними, виходячи з часу, необхідного для визначення, що пароль невірний.


1
Гарні поради :) Щодо SSL, нам потрібно було розробити щось, що буде працювати в дикій природі , і просто використали асиметричну криптографію для кодування пароля (вимагає Javascript), а потім розшифрували його на сервері. Сіль + хеш потім відбувається нормально. Крім того, оскільки відкритий ключ надсилається разом із веб-сторінкою, він може змінюватися довільно часто.
Матьє М.

1
@Matthieu M .: Коли хтось може підробити вашу веб-сторінку, він також може змінити там відкритий ключ на той, де сам знає відповідний приватний ключ. Тож ваша ідея допомагає лише проти пасивних атак читання, а не проти людино-середини.
Paŭlo Ebermann

@Paulo: так, я погоджуюся, що SSL стосується не лише шифрування, а й сертифіката, на жаль, я не дзвоню сюди, і коли люди кажуть, що хочуть користуватися веб-сторінкою регулярним http://підключенням ... це неприємно: /
Матьє М.

@Matthieu: Це означає, що ви надсилаєте public_key як частину загальнодоступної веб-сторінки, здійснюєте обчислення encrypt(entered_password, public_key)на клієнті та надсилаєте цей результат на сервер, який працює does_password_match?(user, decrypt(encrypted_password, private_key))?
Кен Блум

@Ken: більш-менш, ви отримали право шифрування. Для відповідності паролю більше does_password_match(user, salt, decrypt(encrypted, key)), з сіллю залежно від користувача. Як я вже говорив, очевидним питанням є відсутність захисту людини в середині.
Матьє М.

52

Це може припустити, що ви зберігаєте паролі у відкритому тексті, що ні-ні, навіть у сценаріях низької безпеки.

Ви повинні мати:

if(hash(enteredPassword) == storedHash)

Ви можете використовувати простий хеш, наприклад, MD5


22
+1 для хешування пароля. Але я хоч би трохи додав ще й солі. В іншому випадку, оскільки користувачі збираються повторно використовувати імена користувачів та паролі між системами, порушення вашого додатка із низьким рівнем безпеки може дати можливість зловмиснику порушити набагато більш високу програму безпеки. Наприклад, нещодавній злом HBGary вдалося скомпрометувати систему CMS, що працює на їхньому веб-сайті, і частково перетворити це на кореневий доступ до своїх серверів, оскільки система CMS з низькою захищеністю не додавала солі в хеші arstechnica.com/tech-policy/ новини / 2011/02 /…
Джастін Печера

1
Погодьтесь ... розгляньте наступне .. "рядки JavaFile.class | grep -i пароль"
Білл

Яка проблема у тому, щоб мати пароль у простому тексті, якщо вони використовуються лише один раз?

10
@Tim, оскільки користувачі не будуть використовувати пароль лише один раз. Дослідження послідовно показують, що користувачі повторно використовують паролі кілька разів (наприклад, theregister.co.uk/2011/02/10/password_re_use_study ) незалежно від того, скільки разів їм не кажуть.
Скотт

3
@Tim: окрім того, просто відкрийте свій exe, dll тощо у текстовому редакторі, і ви, швидше за все, побачите свій пароль саме там.
Gus Cavalcanti

14

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


Я лише відкрив провайдерів членства в ASP.Net, але дивився на них, думаючи, "скільки разів я витратив свій час на реалізацію чогось подібного?"
Гленатрон

8

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

isSecuritySufficient = effortToBreak > rewardForBreaking

Поширене непорозуміння щодо людей, які роблять погані справи, - це те, що вони шукають. Більшість із них намагаються знищити довіру . Ви завжди повинні робити все можливе, щоб захистити довіру користувачів. Частина цього - ваша належна ретельність, щоб переконатися в безпеці їхньої особи . Вони можуть менше піклуватися про дані, які вони зберігають, але вони дбають про свою особистість - навіть при найнижчому порозі безпеки.

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

Загальні принципи захисту пароля

  • Ніколи не зберігайте паролі в простому тексті
  • Хеш із використанням захищеної хеш-функції, як SHA-1 або навіть SHA-512 (навіть MD5 занадто просто, щоб знайти відповідний хеш)
  • Використовуйте значення додаткової солі. Сіль - випадкові байти, або додані до пароля, щоб ускладнити здогадки. Сіль повинна генеруватися під час виконання та використовувати інформацію про машину як значення насіння, а не зберігати та посилатися будь-яким чином.
  • Використовуйте конкретне для користувача значення солі. Використовуйте це разом із сіллю програми.
  • Зашифруйте всі запити на аутентифікацію, які переходять через мережу. Це означає використовувати SSL для веб-додатків.

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

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


1
Спочатку мене дуже вразила ідея застосування солі + споживча сіль, але чим більше я про це думаю, тим менше переконаний. Якщо ви використовували, скажімо, 4 символи солі програми та 4 користувальницької солі, то різниця між цією та 8 символами солі користувача становить лише те, що половина солі буде однаковою для кожного користувача. Здавалося б, було б більш безпечним просто збільшити розмір солі користувача, ніж мати сіль для застосування. Крім того, якщо сіль програми базується на апаратному забезпеченні, ви не можете оновити або змінити обладнання, не скасовуючи всі паролі.
Девід Конрад

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

Ах, бачу, залиште частину солі в базі даних. Це має сенс. Дякую.
Девід Конрад

Я не бачу проблем із збереженням солі на рядок, якщо її унікальна на рядок. Ось хеш: "fd84235a55bbfeb1585a3dd069d48127989c9753058b51b6ba2056fd6c5a0a91" (SHA256), ось сіль: "671254bdf7944f8fa88e6c9913b948ee". Думаєте, ви можете отримати пароль? Для цієї солі не існує веселкового столу (навіть якщо вам дають сіль), ви змусили її змусити.
Брайан Ботчер

3

Це добре, якщо пароль не використовується ні для чого іншого. Все ще існує ризик, що користувач вирішить, що він може повторно використовувати пароль, тому було б ще краще:

if(hash(enteredPassword) == hashOfValidPassword)

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


1
Як і в коментарі Джастіна Кейва до відповіді вартека, використовуйте сіль, так if (hash (enteredPassword + salt) == hashOfValidSaltedPassword)- і зауважте, що +це, мабуть, конкатенація, а не додавання. Це дійсно перешкоджає використанню веселкових таблиць, які є таблицями хешей ймовірних паролів.
Девід Торнлі

якщо все, що ви перевіряєте, це хеш, чи не могли б вони просто пройти цикл можливих рядків, поки один не створить той самий хеш, що і збережений хеш? Є багато рядків, які могли б відповідати одному і тому ж хешу.
Морган Херлокер

@Prof Plum: Дуже важко знайти зіткнення, якщо алгоритм хешування добре. Це основа сучасної криптографії: вони по суті є односторонніми функціями.

3

Чи доступний вихідний код? Навіть якщо ні, я впевнений, що пароль можна знайти в інструкціях до машини, якщо двійковий файл доступний. Я рекомендую зробити контрольну суму і порівняти її замість цього.

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


2
Так, погана ідея, якщо це проект з відкритим кодом :)

-1 - Якщо ви думаєте, що джерело має значення, ви нічого не знаєте про безпеку.
mattnz

1

Абсолютно не. Прочитайте це , там описується, як хакери зламали веб-сайт із безпеки. Ви плануєте мати вас як найслабшу ланцюжок у ланцюжку.


0

У кількох відповідях було відмічено, що потрібно зберігати не сам пароль, а хеш - і слід використовувати SSL.

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

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

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


-2

Поки це сторона сервера .. Тоді так.

Якщо ви хочете трохи більше захистити, перейдіть на https та зашифруйте \ хеш пароля в БД.


3
Навіщо вважати, що це веб-додаток?
Кріс

Гарна думка! Я тільки що зробив.
Морон

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