Хуки

Хук crypto: виявлення слабкої криптографії

Перевірте кодову базу на слабкі криптографічні примітиви або оцініть окремий фрагмент коду просто з командного рядка.

Хук crypto позначає слабкі криптографічні примітиви в місці виклику: застарілий шифр, небезпечний режим або зламаний геш. Він враховує мову й читає кожен файл за його власними правилами, тож конструкцію Python ніколи не буде позначено у файлі Rust. Це детермінований рушій спеціалізації crypto, який ви можете запускати самі в режимі scan або check.

Запуск​

npx lagune read crypto # scans the whole project
npx lagune read crypto --dir src # scans a directory
npx lagune read crypto --file hash.ts # scans a single file

Перевірка виводить до двох розділів. Weak cryptography found є набором знахідок (DES/3DES/RC4/Blowfish/RC2, режим ECB): кожна з них є зламаним шифрувальним примітивом, тож хук завершується з ненульовим кодом. Cryptography to review manually є набором зачіпок, які хук не може оцінити сам: геш MD5/SHA-1 (зламаний для потреб безпеки, але цілком доречний як звичайна контрольна сума, тож усе вирішує намір), некриптографічний генератор випадкових чисел у контексті безпеки або порівняння, вразливе до атак за часом. Чистий запуск виводить no weak cryptography found.

Як читати вердикт​

ВердиктЗначення
weakФрагмент використовує зламаний шифрувальний примітив (DES/3DES, RC4, Blowfish, RC2 або режим ECB).
reviewПримітив, що залежить від наміру: геш MD5/SHA-1 або некриптографічний генератор випадкових чисел у контексті безпеки.
safeФрагмент використовує криптографію, і слабких примітивів не знайдено.
invalidФрагмент не містить розпізнаваної криптографічної конструкції, яку можна оцінити.

Параметри CLI​

ПараметрЗначенняОпис
--patternфрагмент кодуПеревірити один фрагмент. Повторіть, щоб перевірити кілька, по вердикту на рядок.
--langмоваОбов'язковий із --pattern: одна з javascript, python, go, java, kotlin, php, ruby, rust, csharp, c, cpp.
--dirкаталогОбмежити перевірку каталогом. Повторюється й поєднується з --file.
--fileфайлОбмежити перевірку одним файлом. Повторюється й поєднується з --dir.

Без параметрів хук перевіряє весь проєкт. --pattern потребує --lang і не поєднується з --dir чи --file.

Підтримувані мови​

Перевірка читає ці мови, визначаючи їх за розширенням файлу, і звіряє кожну з її власними криптографічними API.

МоваСлабкі шифри (знахідка) і геші та генератори випадкових чисел (перегляд)
JavaScript / TypeScriptcreateCipher, CryptoJS.DES/RC4, *-ecb у лапках; MD5/SHA-1 createHash/subtle.digest; Math.random()
Pythonpycryptodome DES/ARC4/Blowfish.new, algorithms.TripleDES, MODE_ECB; hashlib.md5/sha1; random.*
Godes.NewCipher, rc4.NewCipher, blowfish.NewCipher, NewECBEncrypter; md5/sha1.Sum; math/rand
Java / KotlinCipher.getInstance("DES"/…/ECB"); MessageDigest.getInstance("MD5"), HmacMD5; java.util.Random
PHPopenssl_encrypt("des-…"/"…-ecb"), mcrypt_*; md5()/sha1(), hash("md5", …); rand()/mt_rand()
RubyOpenSSL::Cipher.new("des-…"), :ECB; Digest::MD5/SHA1; rand()/Random
RustRc4::, Blowfish::, des::, ecb::; Md5::, Sha1::, Hmac<Md5>; SmallRng/XorShiftRng
C#DES/TripleDES/RC2.Create, CipherMode.ECB; MD5/SHA1.Create, HMACMD5; new Random()
C / C++OpenSSL DES_*/RC4/EVP_des_*, EVP_*_ecb; MD5()/SHA1(), EVP_md5; rand()/random()
Найкраще з можливого, але не вичерпно

Хук читає вихідний код як текст, тож примітив, зібраний під час виконання, прихований за псевдонімом або записаний у формі, яку хук не розпізнає, може прослизнути. Сприймайте таблицю як надійну відправну точку, а не як повний перелік.

порада

Хук гарантує мінімум (ці конструкції існують): керування ключами, повторне використання IV і доповнення RSA і далі охоплює спеціалізація crypto, бо це питання судження.

Часті запитання

Запустіть хук crypto без прапорців. Зламані шифри й режим ECB є знахідками, що завершуються з ненульовим кодом. Геш MD5/SHA-1 є зачіпкою для перегляду, бо він зламаний для потреб безпеки, але цілком доречний як звичайна контрольна сума.

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