Шифрування неможливо відновити?


9

У мене складається враження, що зашифрований рядок не можна розшифрувати, тому початкове значення втрачено назавжди.

Однак, якщо наступний рядок завжди дорівнює "домініка" (моє ім'я), то чи не може бути логічного способу його змінити; як це не випадково, і не засноване на даті / часі, але є логічний метод для цього?

0WrtCkg6IdaV/l4hDaYq3seMIWMbW+X/g36fvt8uYkE=

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

Приклад того, про що я говорю:

public string EncryptPassword(string password)
{
    return Convert.ToBase64String(
        System.Security.Cryptography.SHA256.Create()
        .ComputeHash(Encoding.UTF8.GetBytes(password)));
}

3
Ви говорите про криптографічний хеш імені (часто використовується у паролях)? або шифрування (яке має бути розшифроване уповноваженою особою)?

11
SHA256є криптографічною хеш-функцією , а не алгоритмом шифрування. Це одностороння функція .

1
Обов’язкове відмови: соліть хеш ( en.wikipedia.org/wiki/Salt_(cryptography) ). Крім того, SHA256, як правило, занадто швидкий, щоб не мати проблем із жорстокими нападами, використовуючи, наприклад, GPU. Рекомендується використовувати щось на зразок PBKDF2 або scrypt.
Maciej Piechotka

7
Вилуплення - як м'ясорубка. Можна перетворити корову на мелену яловичину, але не навпаки.
Ніл МакГуйган

1
Вас бентежить шифрування відкритим / приватним ключем? Якщо хтось інший шифрує повідомлення за допомогою вашого відкритого ключа, він не може розшифрувати це повідомлення самостійно. Тільки ви можете розшифрувати це - і, можливо, АНБ, Моссад, ФСБ та Tiroler Geheimdienst.
ott--

Відповіді:


39

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

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

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

Інша властивість сильного криптографічного хешу полягає в тому, що його дуже важко повернути. Ви знаєте, що цінністю 0WrtCkg6IdaV/l4hDaYq3seMIWMbW+X/g36fvt8uYkE=є хеш для "домініка", тому що ви тільки що це розробили, але якщо ви цього не знали і не знали, з чого почати шукати, і все, що у вас було 0WrtCkg6IdaV/l4hDaYq3seMIWMbW+X/g36fvt8uYkE=, це може буквально зайняти вас мільярди років, щоб зрозуміти, що оригінал був "домінічним", якщо хеш - хороший. Знову ж таки, це корисно для запобігання пошкодження застави у випадку викрадення списку паролів.


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

15
@ user1477388: Так, саме тому веб-сайти пропонують це. Це добре відомий спосіб атакувати хешовані паролі: це називається "словникова атака" з очевидних причин, а використання слів, яких немає у словнику, є важливим кроком для захисту від них ..
Мейсон Уілер

1
Схоже, це має гарне уявлення про мою "нездатність повірити, що це не можна якось змінити" security.stackexchange.com/questions/11717/… Не те, щоб я хотів / мав би потребу в тому, щоб їх змінити; Мені просто цікаво.
користувач1477388

3
Ще одна пропозиція - додати до кожного пароля щось унікальне перед тим, як він буде хеширован. Різниця в однозначному паролі робить зовсім інший хеш, ідея полягає в тому, що всі ваші хеш-результати будуть унікальними. В іншому випадку, якщо хакер виявить хеш для слова "password123", вони б знали використовувати це для ВСІХ імен користувачів із цим конкретним хешем. Це здається, що у вас є хороша голова для подібних речей, однак, удача.
Katana314

1
@MasonWheeler: використання слів, яких немає у словнику, насправді не потрібно, особливо враховуючи, як "словник", який використовується у типовій атаці, є не що інше, як словник Оксфорда, а перелік рядків, як відомо, часто використовуються в паролях . Замість того, щоб намагатися уникати цих слів, краще вибрати, скажімо, 5 випадкових слів зі списку 2000 або близько таких слів: така парольна фраза, навіть якщо словник із 2000 слів відома, займає грубу фразу майже в 100 разів довше сила, ніж 8 випадкових символів із 64.
tdammers

9

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

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

На жаль, у нас немає ідеального випадкового оракула; ідея має практичні можливості для цифрової реалізації, такі як здатність оракула ефективно зберігати та ефективно пригадувати кожне повідомлення, коли-небудь у будь-якому місці, що завгодно, і здатність клієнтів приймати число, яке може становити сотні чи тисячі десяткових цифр в довжину. Натомість у нас є хеш-функції, які є незворотними (односторонніми) математичними операціями, які працюють над самим повідомленням, щоб створити детерміновану трансформацію (те саме повідомлення => той же хеш) без видимихспіввідношення між хешем та оригінальним повідомленням. Як зазначалося в коментарях, також не повинно бути передбачуваних змін хеш-значень, вироблених внесенням систематичних змін у повідомлення; в ідеалі кожен шматочок дайджесту мав би 50% шансів зміни, враховуючи зміну одного біта повідомлення.

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

Якщо ви коли-небудь знаходили спосіб ефективного зворотного перетворення хешу для SHA256, щоб створити повідомлення (будь-яке повідомлення), яке призведе до цього хешу, це буде підтвердженням, демонструючи, що насправді хеш принципово зламаний. Насправді, SHA256 вважається безпечним, тобто немає документально підтвердженого методу, яким би практичним не було, починати з дайджесту хешу і створювати зіткнення повідомлення, яке потребує менше роботи, ніж просто спроба будь-якої можливості (що для SHA-256 ідеально 2 ^ 256 ~ = 10 ^ 77 можливостей).


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

2
@ MichaelKjörling: Точно кажучи, слід очікувати, що кожен біт змінюватиметься з 50% ймовірністю, що відрізняється від (але передбачає) очікування зміни в середньому 50% бітів.
Дітріх Епп

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