JavaScript: SHA-256 hashing and HMAC with node:crypto
A cryptographic hash such as SHA-256 maps any input to a fixed 32-byte digest. Changing one character of the input changes the digest completely, so hashes are used to check integrity. Anyone can compute a plain hash, though, so it does not prove who produced the message.
JavaScript
const crypto = require("node:crypto");
const sha = (text) => crypto.createHash("sha256").update(text).digest("hex");
console.log(sha("abc"));
console.log(sha("abd"));
const message = "what do ya want for nothing?";
const tag = crypto.createHmac("sha256", "Jefe").update(message).digest();
console.log(tag.toString("hex"));
const again = crypto.createHmac("sha256", "Jefe").update(message).digest();
const forged = crypto.createHmac("sha256", "Jefe").update("what do ya want for something?").digest();
console.log("same message valid: " + crypto.timingSafeEqual(tag, again));
console.log("tampered message valid: " + crypto.timingSafeEqual(tag, forged));