Описание тега cryptographic-hash-function
Криптографическая хеш-функция - это функция, которая принимает строку байтов переменной длины и возвращает дайджест фиксированной длины, так что чрезвычайно сложно найти два входа, которые дают одинаковый результат, или найти исходный вход при выходе. Также желательно, чтобы небольшое изменение на входе приводило к большому изменению выпуска. Общие хеш-функции включают MD5, SHA-1, SHA-256, SHA-512 и RIPEMD.
Криптографической хэш - функция является функцией, которая принимает строку байт переменной длины для ввода и возвращает фиксированное число байт (точное число в зависимости от функции), так что:
- Найти вход по выходу крайне сложно.
- Чрезвычайно сложно найти другой вход, который дает такой же результат.
- Предпочтительно, небольшое изменение ввода приводит к большому изменению вывода. ( эффект лавины)
Общие хеш-функции включают:
- MD5 (128-битный вывод, тег: md5; обнаружены уязвимости)
- SHA-1 (160-битный вывод, тег: sha-1; обнаружены уязвимости)
- SHA-2, включая SHA-512 (512-битный вывод, тег: sha-512)
- RIPEMD-160 (160-битный вывод, тег: ripemd)
Есть также некоторые другие примечательные хэш-функции, которые менее зрелы:
- SHA-3 / Keccak, победитель конкурса хэш-функций NIST (tag: sha-3)
Приложения
Хотя существует множество применений криптографических хеш-функций, вот некоторые из них:
- В сочетании с солью его можно использовать для хранения паролей. (тег: соленый хаш)
- Его можно использовать как часть HMAC. (тег: hmac)
Связанные вопросы
- Каковы важные моменты криптографических хеш-функций?
- Какую криптографическую хеш-функцию мне выбрать?
Использование на разных языках
В Python, можно использовать hashlib
модуль:
import hashlib
hashlib.md5(b'stackru').hexdigest() # => fcb3cd0c1efd8afe09d0505e46cefa4c
hashlib.sha1(b'stackru').hexdigest() # => 47dd9a3d44ce99e3bbd366c9c91a60fc96281e66
hashlib.sha256(b'stackru').hexdigest() # => 37a04a3fbe1f4424d5ed539c213b8f56ff07dcf9d94a360fa8b4efb69d22c1ede93e1dc4928760bf84ffe5b176babb60344b1a10bda218aaa35eb6388a9db3ec
В Ruby можно использовать digest
:
require 'digest'
Digest::MD5.new.update('stackru').hexdigest # => fcb3cd0c1efd8afe09d0505e46cefa4c
Digest::SHA1.new.update('stackru').hexdigest # => 47dd9a3d44ce99e3bbd366c9c91a60fc96281e66
Digest::SHA2.new(512).update('stackru').hexdigest # => 37a04a3fbe1f4424d5ed539c213b8f56ff07dcf9d94a360fa8b4efb69d22c1ede93e1dc4928760bf84ffe5b176babb60344b1a10bda218aaa35eb6388a9db3ec
Digest::RMD160.new.update('stackru').hexdigest # => 4a275d3d6a77a69a7e0bd06241d35378348b7438
В C# можно использовать System.Security.Cryptography.HashAlgorithm
:
using System.Security.Cryptography;
byte[] input = /* ... */;
HashAlgorithm.Create("MD5").ComputeHash(input); // => array of bytes
HashAlgorithm.Create("SHA1").ComputeHash(input); // => array of bytes
HashAlgorithm.Create("SHA512").ComputeHash(input); // => array of bytes
HashAlgorithm.Create("RIPEMD160").ComputeHash(input); // => array of bytes
В Java можно использовать java.security.MessageDigest
:
import java.security.MessageDigest;
byte[] input = /* ... */;
// getInstance can throw NoSuchAlgorithmException if the algorithm is unsupported
MessageDigest md = MessageDigest.getInstance("MD5" /* or any other algorithm */);
md.digest(input); // => array of bytes
Многие другие языки имеют механизмы для хеширования; см. Rosetta Code для получения дополнительной информации: