Веб-програмісти повинні знати, що вони ніколи не повинні намагатися реалізовувати криптовалюту самостійно.
Зокрема, це означає, що жоден експерт із питань безпеки не повинен торкатися жодного криптографічного примітиву безпосередньо. Вони не повинні думати на рівні AES, SHA-1 тощо. Натомість вони повинні використовувати функції високого рівня для шифрування та підписання повідомлень та "хеш" паролів.
Чому? Бо в іншому випадку людей вводять в оману, думаючи, що:
- AES-256 - це "велике шифрування", незважаючи на те, що вони використовують його в режимі ECB, або використовують невипадкові значення IV тощо. Так багато.)
- Вони можуть використовувати один і той же симетричний ключ для шифрування декількох повідомлень (або, що ще гірше, зберігати симетричний ключ у коді для прямого використання).
- Вони можуть навіть вирішити використовувати парольну фразу як ключ безпосередньо, не використовуючи жодних ключових функцій.
- Вони можуть використовувати RSA для шифрування даних безпосередньо.
- Вони можуть просто "посолити та MD5" свої паролі, щоб захистити їх. (Якщо ви вважаєте, що столики веселки - це найслабша ланка, подумайте ще раз .)
Просто щоб бути на одній сторінці, жоден із перерахованих вище пунктів не в порядку . Якщо ви цього не зрозумієте, то не варто торкатися криптовалюти 10-футовим полюсом! (AES-256 - це чудове шифрування, але лише якщо ви його правильно використовуєте. "Важливий не той розмір, це те, що ви з ним робите." :-))
Про які функції високого рівня я говорю? Я особисто рекомендую використовувати бібліотеку OpenPGP (для даних у спокої) або SSL (для даних у русі). Ці протоколи жорстко визначають правильне використання асиметричних, симетричних та хеш-алгоритмів. Наприклад, з OpenPGP:
- Він не використовує RSA для шифрування даних безпосередньо, а натомість генерує випадковий (симетричний) ключ сеансу на повідомлення (це важливо), і використовує RSA для шифрування цього сеансового ключа.
- Він використовує функцію виведення ключа для перетворення парольних фраз у ключі. (У мові OpenPGP це називається S2K, але я думаю, що "ключова функція виведення" є більш стандартним терміном.)
- Він справляється з вибором хорошого режиму, тому ви ніколи не закінчите користуватися ECB.
- Він обробляє керування ключами для вас, тому вам не доведеться приймати спеціальні рішення про те, які клавіші надійні тощо.
Резюме: якщо ви не експерт з безпеки, і думаєте на рівні AES, або SHA-1, або (не дай бог) MD5, ви робите це неправильно . Використовуйте бібліотеку, написану експертами з безпеки (наприклад, Bouncy Castle), які реалізують протоколи, розроблені експертами з безпеки (наприклад, OpenPGP для шифрування, або bcrypt або scrypt для хешування паролів), а не прокатуйте свій власний.
Я жодним чином не є експертом з криптовалюти, але знаю достатньо, щоб не намагатися створити власні спеціальні протоколи. Просто, щоб було зрозуміло, весь цей пост - це матеріал Криптографії 101 . Тож якщо ця публікація не на 100% має сенсу для вас, то ви точно не повинні знаходитись біля криптографії.