Описание тега cryptographic-hash-function

Криптографическая хеш-функция - это функция, которая принимает строку байтов переменной длины и возвращает дайджест фиксированной длины, так что чрезвычайно сложно найти два входа, которые дают одинаковый результат, или найти исходный вход при выходе. Также желательно, чтобы небольшое изменение на входе приводило к большому изменению выпуска. Общие хеш-функции включают MD5, SHA-1, SHA-256, SHA-512 и RIPEMD.

Криптографической хэш - функция является функцией, которая принимает строку байт переменной длины для ввода и возвращает фиксированное число байт (точное число в зависимости от функции), так что:

  • Найти вход по выходу крайне сложно.
  • Чрезвычайно сложно найти другой вход, который дает такой же результат.
  • Предпочтительно, небольшое изменение ввода приводит к большому изменению вывода. ( эффект лавины)

Общие хеш-функции включают:

Есть также некоторые другие примечательные хэш-функции, которые менее зрелы:

Приложения

Хотя существует множество применений криптографических хеш-функций, вот некоторые из них:

  • В сочетании с солью его можно использовать для хранения паролей. (тег: соленый хаш)
  • Его можно использовать как часть 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 для получения дополнительной информации: