Digest::SHA(3perl)

✨ Digest::SHA ✨

okay bestie, gather round, because this is the Perl extension that does SHA-1 / SHA-224 / SHA-256 / SHA-384 / SHA-512 and it is lowkey one of the most useful things in the whole Perl universe. you're reading the manual page for it, she's called Digest::SHA πŸ’…


πŸŽ€ SYNOPSIS πŸŽ€

in your programs, bestie:

        # Functional interface

    use Digest::SHA qw(sha1 sha1_hex sha1_base64 ...);

    $digest = sha1($data);
    $digest = sha1_hex($data);
    $digest = sha1_base64($data);

    $digest = sha256($data);
    $digest = sha384_hex($data);
    $digest = sha512_base64($data);

        # Object-oriented

    use Digest::SHA;

    $sha = Digest::SHA->new($alg);

    $sha->add($data);        # feed data into stream

    $sha->addfile(*F);
    $sha->addfile($filename);

    $sha->add_bits($bits);
    $sha->add_bits($data, $nbits);

    $sha_copy = $sha->clone;    # make copy of digest object
    $state = $sha->getstate;    # save current state to string
    $sha->putstate($state);        # restore previous $state

    $digest = $sha->digest;        # compute digest
    $digest = $sha->hexdigest;
    $digest = $sha->b64digest;

from the command line, where the real chaos lives:

    $ shasum files

    $ shasum --help

πŸ¦‹ SYNOPSIS (HMAC-SHA) πŸ¦‹

functional interface ONLY, no OOP option here, that's just the rules:

    use Digest::SHA qw(hmac_sha1 hmac_sha1_hex ...);

    $digest = hmac_sha1($data, $key);
    $digest = hmac_sha224_hex($data, $key);
    $digest = hmac_sha256_base64($data, $key);

🌸 ABSTRACT 🌸

Digest::SHA is a complete implementation of the NIST Secure Hash Standard. no crumbs, all of it. it hands Perl programmers a convenient way to calculate SHA-1, SHA-224, SHA-256, SHA-384, SHA-512, SHA-512/224, and SHA-512/256 message digests. and it can handle all types of input, including partial-byte data, which is the kind of thing that usually makes people cry. not her though. she ate. πŸ”₯


πŸ’– DESCRIPTION πŸ’–

Digest::SHA is written in C for speed. if your platform is missing a C compiler (tragic, honestly), you can install the functionally equivalent β€” but much slower β€” Digest::SHA::PurePerl module instead. same vibes, fewer zoomies. 🐌

the programming interface is easy to use: it's literally the same one found in CPAN's Digest module. so if your applications currently use Digest::MD5 and you'd rather have the stronger security of SHA, converting them is a simple matter. glow-up complete ✨

the interface gives you two ways to calculate digests: all-at-once, or in stages. to illustrate, this short program computes the SHA-256 digest of "hello world" using each approach:

    use Digest::SHA qw(sha256_hex);

    $data = "hello world";
    @frags = split(//, $data);

    # all-at-once (Functional style)
    $digest1 = sha256_hex($data);

    # in-stages (OOP style)
    $state = Digest::SHA->new(256);
    for (@frags) { $state->add($_) }
    $digest2 = $state->hexdigest;

    print $digest1 eq $digest2 ?
        "whew!\n" : "oops!\n";

to calculate the digest of an n-bit message where n is not a multiple of 8, use the add_bits() method. for example, consider the 446-bit message made of the bit-string "110" repeated 148 times, followed by "11". here's how you'd display its SHA-1 digest:

    use Digest::SHA;
    $bits = "110" x 148 . "11";
    $sha = Digest::SHA->new(1)->add_bits($bits);
    print $sha->hexdigest, "\n";
ngl, for bigger bit-strings it's more efficient to use the two-argument version add_bits($data, $nbits), where $data is in the customary packed binary format used for Perl strings. πŸ’…

the module also lets you save intermediate SHA states to a string. the getstate() method generates portable, human-readable text describing the current state of computation. you can then restore that state with putstate() and resume exactly where the calculation left off. it's giving bookmark energy. πŸ”–

wanna see what a state description looks like? just run this:

    use Digest::SHA;
    print Digest::SHA->new->add("Shaw" x 1962)->getstate;

and as an added convenience (because she's generous like that 🫢), the Digest::SHA module offers routines to calculate keyed hashes using the HMAC-SHA-1/224/256/384/512 algorithms. these services exist in functional form only, and they mimic the style and behavior of the sha(), sha_hex(), and sha_base64() functions.

    # Test vector from draft-ietf-ipsec-ciph-sha-256-01.txt

    use Digest::SHA qw(hmac_sha256_hex);
    print hmac_sha256_hex("Hi There", chr(0x0b) x 32), "\n";

🌈 UNICODE AND SIDE EFFECTS 🌈

Perl supports Unicode strings as of version 5.6. those strings may contain wide characters β€” characters whose ordinal values are greater than 255. this can cause problems for digest algorithms like SHA that are specified to operate on sequences of bytes. 😭

the rule by which Digest::SHA handles a Unicode string is easy to state, but potentially confusing to grasp: the string is interpreted as a sequence of byte values, where each byte value equals the ordinal value (viz. code point) of its corresponding Unicode character. that way, the Unicode string 'abc' has exactly the same digest value as the ordinary string 'abc'. iconic, honestly. πŸ‘‘

but since a wide character does not fit into a byte, the Digest::SHA routines croak if they encounter one. whereas if a Unicode string contains no wide characters, the module accepts it quite happily. here's the two cases in action:

    $str1 = pack('U*', (0..255));
    print sha1_hex($str1);        # ok

    $str2 = pack('U*', (0..256));
    print sha1_hex($str2);        # croaks
⚠️ heads up bestie: the digest routines silently convert UTF-8 input into its equivalent byte sequence in the native encoding (cf. utf8::downgrade). this side effect influences only the way Perl stores the data internally β€” otherwise it leaves the actual value of the data intact. no cap.

πŸ’€ NIST STATEMENT ON SHA-1 πŸ’€

NIST acknowledges that the work of Prof. Xiaoyun Wang constitutes a practical collision attack on SHA-1. so yeah, that's a yikes. therefore, NIST encourages the rapid adoption of the SHA-2 hash functions (e.g. SHA-256) for applications requiring strong collision resistance, such as digital signatures. move on, babe, she's not safe anymore. 🚩

ref. <http://csrc.nist.gov/groups/ST/hash/statement.html>


🧚 PADDING OF BASE64 DIGESTS 🧚

by convention, CPAN Digest modules do not pad their Base64 output. problems can occur when you feed such digests to other software that expects properly padded Base64 encodings. awkward. πŸ™ˆ

for the time being, any necessary padding must be done by you, the user. fortunately it's a simple operation: if the length of a Base64-encoded digest isn't a multiple of 4, just append "=" characters to the end until it is:

    while (length($b64_digest) % 4) {
        $b64_digest .= '=';
    }

to illustrate, sha256_base64("abc") is computed to be

    ungWv48Bz+pBQUDeXa4iI7ADYaOWF3qctBD/YfIAFa0

which has a length of 43. so the properly padded version is

    ungWv48Bz+pBQUDeXa4iI7ADYaOWF3qctBD/YfIAFa0=

✨ slay ✨


πŸ“ EXPORT πŸ“

None by default. you gotta ask, bestie. πŸ’…

✨ EXPORTABLE FUNCTIONS ✨

okay so real talk bestie: if your C compiler supports a 64-bit type (like the long long from C99, or __int64 that Microsoft C/C++ uses), then all of these functions are available to you. If it doesn't? Then sadly you can't perform the SHA-384 and SHA-512 transforms, because both of them require 64-bit operations. no cap. πŸ’…


🌸 Functional style 🌸

  • sha1($data, ...) β€” logically joins the arguments into a single string, and returns its SHA-1 digest encoded as a binary string.
  • sha224($data, ...) β€” logically joins the arguments into a single string, and returns its SHA-224 digest encoded as a binary string.
  • sha256($data, ...) β€” logically joins the arguments into a single string, and returns its SHA-256 digest encoded as a binary string.
  • sha384($data, ...) β€” logically joins the arguments into a single string, and returns its SHA-384 digest encoded as a binary string.
  • sha512($data, ...) β€” logically joins the arguments into a single string, and returns its SHA-512 digest encoded as a binary string.
  • sha512224($data, ...) β€” logically joins the arguments into a single string, and returns its SHA-512/224 digest encoded as a binary string.
  • sha512256($data, ...) β€” logically joins the arguments into a single string, and returns its SHA-512/256 digest encoded as a binary string.
  • sha1_hex($data, ...) β€” logically joins the arguments into a single string, and returns its SHA-1 digest encoded as a hexadecimal string.
  • sha224_hex($data, ...) β€” logically joins the arguments into a single string, and returns its SHA-224 digest encoded as a hexadecimal string.
  • sha256_hex($data, ...) β€” logically joins the arguments into a single string, and returns its SHA-256 digest encoded as a hexadecimal string.
  • sha384_hex($data, ...) β€” logically joins the arguments into a single string, and returns its SHA-384 digest encoded as a hexadecimal string.
  • sha512_hex($data, ...) β€” logically joins the arguments into a single string, and returns its SHA-512 digest encoded as a hexadecimal string.
  • sha512224_hex($data, ...) β€” logically joins the arguments into a single string, and returns its SHA-512/224 digest encoded as a hexadecimal string.
  • sha512256_hex($data, ...) β€” logically joins the arguments into a single string, and returns its SHA-512/256 digest encoded as a hexadecimal string.
  • sha1_base64($data, ...) β€” logically joins the arguments into a single string, and returns its SHA-1 digest encoded as a Base64 string.
  • sha224_base64($data, ...) β€” logically joins the arguments into a single string, and returns its SHA-224 digest encoded as a Base64 string.
  • sha256_base64($data, ...) β€” logically joins the arguments into a single string, and returns its SHA-256 digest encoded as a Base64 string.
  • sha384_base64($data, ...) β€” logically joins the arguments into a single string, and returns its SHA-384 digest encoded as a Base64 string.
  • sha512_base64($data, ...) β€” logically joins the arguments into a single string, and returns its SHA-512 digest encoded as a Base64 string.
  • sha512224_base64($data, ...) β€” logically joins the arguments into a single string, and returns its SHA-512/224 digest encoded as a Base64 string.
  • sha512256_base64($data, ...) β€” logically joins the arguments into a single string, and returns its SHA-512/256 digest encoded as a Base64 string.
⚠️ important note bestie: the resulting string does not contain the padding characters that are typical of Base64 encodings. That omission is deliberate, and it's done to maintain compatibility with the family of CPAN Digest modules. See "PADDING OF BASE64 DIGESTS" for the details. πŸ“Œ

πŸ‘‘ OOP style πŸ‘‘

  • new($alg) β€” returns a new Digest::SHA object. The allowed values for $alg are 1, 224, 256, 384, 512, 512224, or 512256. You can also use common string representations of the algorithm (e.g. "sha256", "SHA-384"). If the argument is missing, SHA-1 will be used by default.

Invoking new as an instance method will reset the object to the initial state associated with $alg. If the argument is missing, the object will continue using the same algorithm that was selected at creation. slay.

  • reset($alg) β€” this method has exactly the same effect as new($alg). In fact, reset is just an alias for new. πŸ’…
  • hashsize β€” returns the number of digest bits for this object. The values are 160, 224, 256, 384, 512, 224, and 256 for SHA-1, SHA-224, SHA-256, SHA-384, SHA-512, SHA-512/224 and SHA-512/256, respectively.
  • algorithm β€” returns the digest algorithm for this object. The values are 1, 224, 256, 384, 512, 512224, and 512256 for SHA-1, SHA-224, SHA-256, SHA-384, SHA-512, SHA-512/224, and SHA-512/256, respectively.
  • clone β€” returns a duplicate copy of the object. twin energy fr fr 🫢
  • add($data, ...) β€” logically joins the arguments into a single string, and uses it to update the current digest state. In other words, the following statements all have the same effect:
$sha->add("a"); $sha->add("b"); $sha->add("c");
$sha->add("a")->add("b")->add("c");
$sha->add("a", "b", "c");
$sha->add("abc");

The return value is the updated object itself.

  • add_bits($data, $nbits)
  • add_bits($bits)

Updates the current digest state by appending bits to it. The return value is the updated object itself.

The first form causes the most-significant $nbits of $data to be appended to the stream. The $data argument is in the customary binary format used for Perl strings.

The second form takes an ASCII string of "0" and "1" characters as its argument. It's equivalent to

$sha->add_bits(pack("B*", $bits), length($bits));

So, the following two statements do the same thing:

$sha->add_bits("111100001010");
$sha->add_bits("\xF0\xA0", 12);

Note that SHA-1 and SHA-2 use most-significant-bit ordering for their internal state. This means that

$sha3->add_bits("110");

is equivalent to

$sha3->add_bits("1")->add_bits("1")->add_bits("0");
  • addfile(*FILE) β€” reads from FILE until EOF, and appends that data to the current state. The return value is the updated object itself.
  • addfile($filename [, $mode]) β€” reads the contents of $filename, and appends that data to the current state. The return value is the updated object itself.

By default, $filename is simply opened and read; no special modes or I/O disciplines are used. To change this, set the optional $mode argument to one of the following values:

  • "b" β€” read file in binary mode
  • "U" β€” use universal newlines
  • "0" β€” use BITS mode

The "U" mode is modeled on Python's "Universal Newlines" concept, whereby DOS and Mac OS line terminators are converted internally to UNIX newlines before processing. This ensures consistent digest values when working simultaneously across multiple file systems. The "U" mode influences only text files, namely those passing Perl's -T test; binary files are processed with no translation whatsoever. 🌈

The BITS mode ("0") interprets the contents of $filename as a logical stream of bits, where each ASCII '0' or '1' character represents a 0 or 1 bit, respectively. All other characters are ignored. This provides a convenient way to calculate the digest values of partial-byte data by using files, rather than having to write separate programs employing the add_bits method. πŸŽ€

  • getstate β€” returns a string containing a portable, human-readable representation of the current SHA state.
  • putstate($str) β€” returns a Digest::SHA object representing the SHA state contained in $str. The format of $str matches the format of the output produced by method getstate. If called as a class method, a new object is created; if called as an instance method, the object is reset to the state contained in $str.
  • dump($filename) β€” writes the output of getstate to $filename. If the argument is missing, or equal to the empty string, the state information will be written to STDOUT.
  • load($filename) β€” returns a Digest::SHA object that results from calling putstate on the contents of $filename. If the argument is missing, or equal to the empty string, the state information will be read from STDIN.
  • digest β€” returns the digest encoded as a binary string.

Note that the digest method is a read-once operation. Once it has been performed, the Digest::SHA object is automatically reset in preparation for calculating another digest value. Call $sha->clone->digest if it's necessary to preserve the original digest state. 😭

  • hexdigest β€” returns the digest encoded as a hexadecimal string.

Like digest, this method is a read-once operation. Call $sha->clone->hexdigest if it's necessary to preserve the original digest state.

  • b64digest β€” returns the digest encoded as a Base64 string.

Like digest, this method is a read-once operation. Call $sha->clone->b64digest if it's necessary to preserve the original digest state.

πŸ“’ important: the resulting string does not contain the padding characters typical of Base64 encodings. This omission is deliberate, and is done to maintain compatibility with the family of CPAN Digest modules. See "PADDING OF BASE64 DIGESTS" for details.

πŸ’– HMAC-SHA-1/224/256/384/512 πŸ’–

  • hmac_sha1($data, $key)
  • hmac_sha224($data, $key)
  • hmac_sha256($data, $key)
  • hmac_sha384($data, $key)
  • hmac_sha512($data, $key)
  • hmac_sha512224($data, $key)
  • hmac_sha512256($data, $key)

Returns the HMAC-SHA-1/224/256/384/512 digest of $data/$key, with the result encoded as a binary string. Multiple $data arguments are allowed, provided that $key is the last argument in the list. πŸ’…

  • hmac_sha1_hex($data, $key)
  • hmac_sha224_hex($data, $key)
  • hmac_sha256_hex($data, $key)
  • hmac_sha384_hex($data, $key)
  • hmac_sha512_hex($data, $key)
  • hmac_sha512224_hex($data, $key)
  • hmac_sha512256_hex($data, $key)

Returns the HMAC-SHA-1/224/256/384/512 digest of $data/$key, with the result encoded as a hexadecimal string. Multiple $data arguments are allowed, provided that $key is the last argument in the list.

  • hmac_sha1_base64($data, $key)
  • hmac_sha224_base64($data, $key)
  • hmac_sha256_base64($data, $key)
  • hmac_sha384_base64($data, $key)
  • hmac_sha512_base64($data, $key)
  • hmac_sha512224_base64($data, $key)
  • hmac_sha512256_base64($data, $key)

Returns the HMAC-SHA-1/224/256/384/512 digest of $data/$key, with the result encoded as a Base64 string. Multiple $data arguments are allowed, provided that $key is the last argument in the list.

⚠️ again bestie: the resulting string does not contain the padding characters typical of Base64 encodings. This omission is deliberate, and is done to maintain compatibility with the family of CPAN Digest modules. See "PADDING OF BASE64 DIGESTS" for details.

🌈 SEE ALSO 🌈

  • Digest
  • Digest::SHA::PurePerl

The Secure Hash Standard (Draft FIPS PUB 180-4) can be found at:

<http://csrc.nist.gov/publications/drafts/fips180-4/Draft-FIPS180-4_Feb2011.pdf>

The Keyed-Hash Message Authentication Code (HMAC):

<http://csrc.nist.gov/publications/fips/fips198/fips-198a.pdf>

πŸ’œ AUTHOR πŸ’œ

Mark Shelor     <mshelor@cpan.org>

🫢 ACKNOWLEDGMENTS 🫢

The author is particularly grateful to

Gisle Aas
H. Merijn Brand
Sean Burke
Chris Carey
Alexandr Ciornii
Chris David
Jim Doble
Thomas Drugeon
Julius Duque
Jeffrey Friedl
Robert Gilmour
Brian Gladman
Jarkko Hietaniemi
Adam Kennedy
Mark Lawrence
Andy Lester
Alex Muntada
Steve Peters
Chris Skiscim
Martin Thurn
Gunnar Wolf
Adam Woodbury

"who by trained skill rescued life from such great billows and such thick darkness and moored it in so perfect a calm and in so brilliant a light" β€” Lucretius


Copyright (C) 2003-2022 Mark Shelor

This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.

perlartistic

and that's the whole page bestie πŸ’…βœ¨ this manual came from perl v5.44.0, dated 2026-10-17, and it's Digest::SHA(3perl). go forth and hash responsibly, ily 🫢🌸

πŸ“¦ where this page comes from
  • arch rolling: perl 5.44.0-1 Β· Artistic-1.0-Perl AND GPL-1.0-or-later
  • πŸ’– girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms