Introduction to SHA-224
SHA-224 is a cryptographic hash function that belongs to the SHA-2 (Secure Hash Algorithm 2) family, developed by the National Security Agency (NSA) and published by the National Institute of Standards and Technology (NIST) in 2004 as part of FIPS PUB 180-2.
As a member of the SHA-2 family, SHA-224 shares its internal structure with SHA-256 but produces a shorter, 224-bit (28-byte) hash value. It uses a 64-step iterative structure with eight 32-bit working variables and a message schedule derived from the input data.
SHA-224 was specifically designed to provide a security level appropriate for 112-bit symmetric encryption schemes while maintaining efficiency. It is particularly useful in applications where space is at a premium but robust security is still required.
Key Properties and Characteristics
Hash Output Size
SHA-224 produces a 224-bit (28-byte) hash value, typically represented as a 56-character hexadecimal string.
Block Size
SHA-224 processes messages in 512-bit blocks, allowing for efficient hardware and software implementation.
Security Level
Provides 112 bits of security against collision attacks and 224 bits against preimage attacks, suitable for most modern security applications.
Deterministic
The same input will always produce the exact same output hash, ensuring consistency and reliability.
Avalanche Effect
Even a small change in the input data leads to a significantly different hash output, enhancing security.
One-way Function
Computationally infeasible to reverse the hash to find the original input, ensuring data privacy.
Comparison with Other SHA-2 Family Algorithms
Algorithm | Output Size | Internal State | Block Size | Security Level | Suitable For |
---|---|---|---|---|---|
SHA-224 | 224 bits | 256 bits | 512 bits | 112 bits | Digital signatures, HMAC, certificate verification |
SHA-256 | 256 bits | 256 bits | 512 bits | 128 bits | General purpose cryptography, blockchain, SSL/TLS |
SHA-384 | 384 bits | 512 bits | 1024 bits | 192 bits | Higher security applications, government systems |
SHA-512 | 512 bits | 512 bits | 1024 bits | 256 bits | Highest security needs, cryptographic key generation |
SHA-512/224 | 224 bits | 512 bits | 1024 bits | 112 bits | Optimized for 64-bit platforms with 224-bit output needs |
SHA-512/256 | 256 bits | 512 bits | 1024 bits | 128 bits | Optimized for 64-bit platforms with 256-bit output needs |
While SHA-224 is derived from SHA-256 by using different initial values and truncating the output, it maintains strong security properties for most applications. It's particularly useful in scenarios where 224 bits of output are sufficient and resource conservation is beneficial.
Real-World Usage Examples
Digital Signatures
SHA-224 is used in digital signature algorithms like ECDSA to create message digests that are then signed with a private key, providing authentication and integrity verification.
SSL/TLS Certificates
In certificate generation and verification processes for secure web communications, providing a good balance of security and efficiency.
Data Integrity
Ensuring downloaded files haven't been tampered with by comparing file hashes before and after transmission.
Password Hashing
When used with proper salting and key-stretching techniques, can securely store password hashes in authentication systems.
Blockchain Technology
Some blockchain implementations use SHA-224 for creating transaction hashes and block headers where space efficiency matters.
Random Number Generation
As a component in cryptographically secure pseudorandom number generators (CSPRNGs) for various security applications.
Quick Reference Implementation
Here's a reference implementation of SHA-224 in JavaScript:
// SHA-224 implementation in JavaScript
function sha224(input) {
// Initial hash values (SHA-224 specific)
const H = [
0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939,
0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4
];
// SHA-256 round constants
const K = [
0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5,
0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,
0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc,
0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7,
0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,
0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3,
0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5,
0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,
0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
];
// Convert string to UTF-8 bytes
function stringToBytes(str) {
const encoder = new TextEncoder();
return encoder.encode(str);
}
// Right rotate a 32-bit number
function rightRotate(value, amount) {
return ((value >>> amount) | (value << (32 - amount))) >>> 0;
}
// Process the message
function process() {
// Convert input to bytes and add padding
let bytes = (typeof input === 'string') ? stringToBytes(input) : input;
const originalLength = bytes.length * 8;
// Append the bit '1' to the message
bytes = [...bytes, 0x80];
// Append padding zeros
while ((bytes.length % 64) !== 56) {
bytes.push(0);
}
// Append the length as a 64-bit big-endian integer
const lengthBytes = new Array(8);
for (let i = 7; i >= 0; i--) {
lengthBytes[7 - i] = (originalLength >>> (i * 8)) & 0xff;
}
bytes.push(...lengthBytes);
// Process each 64-byte chunk
for (let i = 0; i < bytes.length; i += 64) {
// Create message schedule array
const W = new Array(64);
// Copy chunk into first 16 words of W
for (let j = 0; j < 16; j++) {
W[j] = (bytes[i + j * 4] << 24) |
(bytes[i + j * 4 + 1] << 16) |
(bytes[i + j * 4 + 2] << 8) |
(bytes[i + j * 4 + 3]);
}
// Extend the first 16 words into remaining 48 words
for (let j = 16; j < 64; j++) {
const s0 = rightRotate(W[j - 15], 7) ^
rightRotate(W[j - 15], 18) ^
(W[j - 15] >>> 3);
const s1 = rightRotate(W[j - 2], 17) ^
rightRotate(W[j - 2], 19) ^
(W[j - 2] >>> 10);
W[j] = (W[j - 16] + s0 + W[j - 7] + s1) >>> 0;
}
// Initialize working variables
let [a, b, c, d, e, f, g, h] = H;
// Main loop
for (let j = 0; j < 64; j++) {
const S1 = rightRotate(e, 6) ^
rightRotate(e, 11) ^
rightRotate(e, 25);
const ch = (e & f) ^ (~e & g);
const temp1 = (h + S1 + ch + K[j] + W[j]) >>> 0;
const S0 = rightRotate(a, 2) ^
rightRotate(a, 13) ^
rightRotate(a, 22);
const maj = (a & b) ^ (a & c) ^ (b & c);
const temp2 = (S0 + maj) >>> 0;
h = g;
g = f;
f = e;
e = (d + temp1) >>> 0;
d = c;
c = b;
b = a;
a = (temp1 + temp2) >>> 0;
}
// Add to hash values
H[0] = (H[0] + a) >>> 0;
H[1] = (H[1] + b) >>> 0;
H[2] = (H[2] + c) >>> 0;
H[3] = (H[3] + d) >>> 0;
H[4] = (H[4] + e) >>> 0;
H[5] = (H[5] + f) >>> 0;
H[6] = (H[6] + g) >>> 0;
H[7] = (H[7] + h) >>> 0;
}
// Produce the final hash (for SHA-224, only use first 7 words)
let result = '';
for (let i = 0; i < 7; i++) {
result += H[i].toString(16).padStart(8, '0');
}
return result;
}
return process();
}
This implementation follows the FIPS 180-4 standard for SHA-224. It processes the input in 512-bit (64-byte) blocks and outputs a 224-bit (28-byte) hash value as a 56-character hexadecimal string.
Interactive Hash Generator
Generate and verify SHA-224 hashes for text or files.
Hash Verifier
Verify if a text produces a specific SHA-224 hash:
Expected SHA-224 Hash:
Documentation
Explore our comprehensive documentation to learn more about SHA-224 and how to implement it in your projects:
Getting Started
Basic concepts and quick implementation guides for developers new to cryptographic hashing.
Read GuideImplementation Guides
Language-specific guides and best practices for secure implementation.
View GuidesLatest Updates and News
SHA-224 in Modern Cryptography
Exploring the role of SHA-224 in today's cryptographic landscape and its continued relevance.
Read MorePerformance Benchmarks 2025
Latest performance metrics across different platforms and languages.
View BenchmarksSecurity Analysis Update
Recent academic research on SHA-224's security properties and resistance to attacks.
Read Analysis