Чи існує алгоритм хешування, який дозволяє мені вказати довжину символу виводу?


0

Мій співробітник служби безпеки шукає алгоритм хешування, який займе рядок до 20 символів, а потім виведе унікальний буквено-цифровий хеш з 12 символів. 20-символьний рядок, як правило, просто буде цифрами (добре, я вам скажу, це номери кредитних карт), тому мені здається стисливим.

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


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

Відповіді:


1

Слідкуйте за тим, як ви обробляєте номери кредитних карт!

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

Це прохання про проблеми рано чи пізно ...

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


Що означає "ніколи не буквально хеш"? О, і до речі, я не хочу алгоритм розшифровки, тому я сказав хешування, а не шифрування. Це призначено (насправді, потрібно) бути одностороннім.
спін

Чим корисний хеш, якщо він односторонній? Це відповідальність за безпеку, якщо хеш виявлено слабким, а в іншому марним.
afrazier

1
@spinn: Я б дуже радив вам ознайомитись з номерами кредитних карт . Якщо ви зробите це неправильно, то в кінцевому підсумку вам буде легко знайти номери кредитних карток, ви, звичайно, можете піти в одну сторону, але тоді ви будете викидати дані, що просто спрощує грубі форсування…
Тамара Війсман

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

@spinn: Чому вам доведеться обходити номери кредитних карток, якщо ви можете використовувати цілі ідентифікатори як первинні ключі? Чому ви б відповідали кредитній картці, а не користувачеві, який використовував цю кредитну картку?
Тамара Війсман

0

У продавця не повинно бути жодних причин зберігати повний номер кредитної картки, хеширувати чи ні.

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

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

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


Чи їм не потрібен повний номер кредитної картки для автоматизованої підписки? Як, наприклад, коли ви граєте у World of Warcraft і вам більше не потрібно торкатися рахунків, тому що вони йдуть автоматично ...
Тамара Війсман

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

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

@TomWijsman: Якщо ви можете жорстоко примусити хеш, у вас є список відомих хороших номерів кредитних карток.
afrazier

Ну, щоб було зрозуміло, мені належить оцінити, чому він це робить. Я можу передати питання, але я просто відповідаю на питання про технічну можливість. Але він завжди має справу з дотриманням PCI, тому пам’ятає про проблеми. (Я сподіваюся.)
спін

0

Якщо ваш вхід - це 20-значний номер, то є 10 20 можливих входів.
Якщо ваш вихід - це 12-символьний буквено-цифровий рядок, то існує 62 12 можливих виходів.

Вхідні дані:

100000000000000000000

Виходи:

3226266762397899821056

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

Отже, ми просто використовуватимемо коротший хеш!

В чому справа? Просто використовуйте ціле число, випадкове, якщо вам доведеться.


Візьмемо паролі як приклад.
Ви ніколи не зберігаєте пароль. Ви зберігаєте тільки хеш. Це дозволяє легко перевірити заданий вклад на цей хеш (щоб побачити, чи вказаний пароль правильний), не зберігаючи фактичний пароль.

Це працює, тому що:

  1. наші алгоритми хешування не створюють однаковий хеш для двох входів легко (зіткнення малоймовірні)
  2. нерозумно вважати, що хтось міг розібратися в оригінальному введенні для даного хешу

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

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

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

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


Чи не доведеться вам обчислити всі 100000000000000000000 хешей, щоб бути впевненим, щоб знайти, яке 20-значне число дало певний рядок з 12 символів?
RedGrittyBrick

@RedGrittyBrick, що трапиться, якщо станеться зіткнення? (Два числа, які призводять до одного хешу)?
Зоредаче

@RedGrittyBrick Так, але кожен раз, коли ви обчислюєте хеш, який існує в базі даних, у вас є дійсний номер CC (варто). І насправді не так багато дійсних чисел. Знаючи, які цифри CC є дійсними, ви можете трохи зменшити вхід.
Der Hochstapler

@Zoredache: добре, що ще краще, обчисливши 100000000000000000000 хешей, ви досі точно не знаєте, які є дійсними номерами CC. Однак ви констатуєте протилежність Олівера, який говорить про слабкість, оскільки "кожен можливий вихід може бути відображений безпосередньо на один вхід" (без зіткнень).
RedGrittyBrick

1
@OliverSalzburg - Я думаю, що сказати "неймовірно просто" - це ідеальне слово для його опису. Це "неймовірно просто", якщо ви маєте справу з злочинною організацією, яка має необмежені кошти (ей, це не їх гроші в теорії) і величезний можливий день оплати.
Рамхаунд

0

Ігноруючи всі вищезазначені питання, є справді, насправді, сліпуче просте рішення.

У псевдокоді:

function my_hash(string data, int length){
    string t = md5sum(data);
    return t.substring(0,length)
}

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

Однак будьте обережні. Прочитайте всі інші відповіді, всі вони мають дуже вагомі бали.


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