Hash Functions. Part 1: Fundamentals
Hash function is a function that accepts data of arbitrary length and produces a fixed-length output called a hash or digest. In practice, three core security properties must hold: preimage resistance, second-preimage resistance, and collision resistance. In addition, a good hash function exhibits the avalanche effect: the smallest change in input produces an unrecognizable change in output.
What is a Hash Function?
Preimage resistance means it is computationally infeasible to recover the original input from the digest. Second-preimage resistance means that, given an input and its digest, finding a different input that yields the same digest is practically impossible. Collision resistance means finding any two distinct inputs that produce the same digest is infeasible; neither input is fixed in advance.
Methods for Ensuring Hash Function Security
The theoretical properties have practical limits. Input data must possess sufficient entropy and length; otherwise an attacker can precompute hashes for all possible values and reverse the digest. The output size is equally critical. A minimum digest length of 256 bits is now considered mandatory because it delivers 128 bits of security against collision attacks. A 128-bit digest suffices only for the first two properties, since modern hardware cannot exhaust 2^128 possibilities.
The birthday paradox illustrates why 256 bits are required for collision resistance. The question “How many people must be in a room for a 50 percent chance that at least two share a birthday?” yields the answer 23. Mathematically, when sampling from a space of size 2^N, a collision is expected after roughly 2^(N/2) attempts. Therefore a 256-bit digest is needed to obtain 128-bit collision security. Because of insufficient collision resistance, MD5 and SHA-1 are considered broken.
Hash Functions in Practice
Hashing can be performed directly from the command line with OpenSSL:
echo -n "some words" | openssl dgst -sha256
Any supported algorithm may replace sha256, and a file path may be supplied instead of a string.
Hash functions enable commitment schemes: a party hashes secret data, publishes the digest, and later reveals the original value for verification. The function simultaneously hides the secret and binds the committer to the original data. They also protect web subresource integrity. When loading scripts or stylesheets from a CDN, the integrity attribute allows the browser to verify that the received file matches the expected digest:
<link rel="stylesheet" href="https://my-provider.com" integrity="sha256-HASH_OF_STYLE" crossorigin="anonymous"><script src="https://my-provider.com" integrity="sha256-HASH_OF_SCRIPT" crossorigin="anonymous"></script>
The most widespread use is password storage with memory-hard functions such as Argon2 and bcrypt. Only the digest is stored; when a user supplies a password it is hashed and compared with the stored value. Because the digest itself must be transmitted securely, a hash function alone does not provide integrity; it must be used within a properly designed protocol.
This concludes Part 1. The next installment will examine the internal structure of SHA-2 and SHA-3, their respective strengths and weaknesses, and the appropriate use of XOF functions.


