LoginSignup
5
2

More than 1 year has passed since last update.

Python3 のハッシュ関数のアルゴリズム一覧の確認方法(hashlib モジュール)

Last updated at Posted at 2018-11-17

Python3 のハッシュ関数で標準サポートされているアルゴリズムを知りたい

しかし、「python3 hashlib アルゴリズム一覧」でググっても、Qiita 記事に絞っても、ドンピシャで出てこなかったため未来の自分のググラビリティとして。

TL; DR (今北産業)

  1. hashlib モジュールの、以下のセット(set)で確認できます。
  2. algorithms_guaranteed: 「標準サポート」のハッシュ・アルゴリズム・セット
  3. algorithms_available: 「利用可能」なハッシュ・アルゴリズム・セット
確認例
$ python3
Python 3.6.0 (default, Jun 18 2018, 13:35:26) 
[GCC 4.2.1 Compatible Apple LLVM 10.0.0 (clang-1000.10.25.5)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> 
>>> import hashlib
>>> print(sorted(hashlib.algorithms_guaranteed))
['blake2b', 'blake2s', 'md5', 'sha1', 'sha224', 'sha256', 'sha384', 'sha3_224', 'sha3_256', 
'sha3_384', 'sha3_512', 'sha512', 'shake_128', 'shake_256']
>>> 
>>> print(sorted(hashlib.algorithms_available))
['DSA', 'DSA-SHA', 'MD4', 'MD5', 'MDC2', 'RIPEMD160', 'SHA', 'SHA1', 'SHA224', 'SHA256', 
'SHA384', 'SHA512', 'blake2b', 'blake2s', 'dsaEncryption', 'dsaWithSHA', 'ecdsa-with-SHA1', 
'md4', 'md5', 'mdc2', 'ripemd160', 'sha', 'sha1', 'sha224', 'sha256', 'sha384', 'sha3_224', 
'sha3_256', 'sha3_384', 'sha3_512', 'sha512', 'shake_128', 'shake_256', 'whirlpool']
>>> 
  • 同じ Python3 でもサブ・バージョンによって内容は異なります。また環境(インストール済みのモジュールなど)によっても内容は異なります。
  • ほとんどの Python3 のバージョンで共通なのは以下
    • md5,sha1,sha224, sha256, sha384, sha512
  • セキュリティアップデート済みの場合は、大抵以下のものが使える
    • blake2bP, blake2s, md5, sha1, sha224, sha256, sha384, sha3_224, sha3_256,
      sha3_384, sha3_512, sha512, shake_128, shake_256
  • 他のプログラム言語と互換性の高いものは以下
    • md5, sha1
    • sha2 系: sha224, sha256, sha384, sha512
    • sha3 系: sha3_224, sha3_256, sha3_384, sha3_512 オススメ
    • 可変長系: shake_128, shake_256

TS; DR (OS 別のデフォルトで使えるハッシュ・アルゴリズムを調べたコマケーこと)

Python3 で利用可能なハッシュ関数のアルゴリズムの調べ方

以下のスクリプトを各々の OS に設置して調べました。なお、OS は測定時の全ての Update が適用済みの状態です。(apt update など)

show_algos.py
import hashlib

print("# 保証されたアルゴリズム一覧")
print(sorted(hashlib.algorithms_guaranteed))

print("# 利用可能なアルゴリズム一覧")
print(sorted(hashlib.algorithms_available))

以下を見るとわかるように、「保証されたアルゴリズム」(algorithms_guaranteed)と言っても、同じ Python3 でもマイナー・バージョンや環境によって標準で利用可能なアルゴリズムは異なるので注意が必要です。(下記は、見やすいように改行を入れています)

macOS HighSierra (OSX 10.13)

macOS(HighSierra)での実行結果
$ date
2018年 11月 17日 土曜日 15:49:54 JST

$ sw_vers
ProductName:	Mac OS X
ProductVersion:	10.13.6
BuildVersion:	17G3025

$ python3 -V
Python 3.6.0

$ python3 show_algos.py
# 保証されたアルゴリズム一覧
['blake2b', 'blake2s', 'md5', 'sha1', 'sha224', 'sha256', 'sha384',
 'sha3_224', 'sha3_256', 'sha3_384', 'sha3_512', 'sha512',
 'shake_128', 'shake_256']

# 利用可能なアルゴリズム一覧
['DSA', 'DSA-SHA', 'MD4', 'MD5', 'MDC2', 'RIPEMD160', 'SHA', 'SHA1',
 'SHA224', 'SHA256', 'SHA384', 'SHA512', 'blake2b', 'blake2s',
 'dsaEncryption', 'dsaWithSHA', 'ecdsa-with-SHA1', 'md4', 'md5',
 'mdc2', 'ripemd160', 'sha', 'sha1', 'sha224', 'sha256', 'sha384',
 'sha3_224', 'sha3_256', 'sha3_384', 'sha3_512', 'sha512',
 'shake_128', 'shake_256', 'whirlpool']

macOS Catalina (OSX 10.15)

macOSでの実行結果
$ date
2021年 5月18日 火曜日 21時48分48秒 JST

$ sw_vers
ProductName:	Mac OS X
ProductVersion:	10.15.7
BuildVersion:	19H1030

$ python3 -V
Python 3.9.4

$ python3 show_algos.py
# 保証されたアルゴリズム一覧
['blake2b', 'blake2s', 'md5', 'sha1', 'sha224', 'sha256', 'sha384',
 'sha3_224', 'sha3_256',
 'sha3_384', 'sha3_512', 'sha512', 'shake_128', 'shake_256']
# 利用可能なアルゴリズム一覧
['blake2b', 'blake2s', 'md4', 'md5', 'md5-sha1', 'mdc2',
 'ripemd160', 'sha1', 'sha224', 'sha256', 'sha384', 'sha3_224',
 'sha3_256', 'sha3_384', 'sha3_512', 'sha512', 'sha512_224',
 'sha512_256', 'shake_128', 'shake_256', 'sm3', 'whirlpool']

Raspbian (Debian 8, Jessie)

Rarpbianでの実行結果
$ cat /etc/os-release | head -1
PRETTY_NAME="Raspbian GNU/Linux 8 (jessie)"

$ python3 -V
Python 3.4.2

$ python3 show_algos.py
# 保証されたアルゴリズム一覧
['md5', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512']

# 利用可能なアルゴリズム一覧
['DSA', 'DSA-SHA', 'MD4', 'MD5', 'RIPEMD160', 'SHA', 'SHA1',
 'SHA224', 'SHA256', 'SHA384', 'SHA512', 'dsaEncryption',
 'dsaWithSHA', 'ecdsa-with-SHA1', 'md4', 'md5', 'ripemd160', 
 'sha', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512',
 'whirlpool']

RaspberryPi OS (Debian 10, Buster)

$ cat /etc/os-release | grep "PRETTY_NAME"
PRETTY_NAME="Raspbian GNU/Linux 10 (buster)"

$ python3 -V
Python 3.7.3

$ python3 show_algos.py
# 保証されたアルゴリズム一覧
['blake2b', 'blake2s', 'md5', 'sha1', 'sha224', 'sha256', 'sha384',
 'sha3_224', 'sha3_256', 'sha3_384', 'sha3_512', 'sha512',
 'shake_128', 'shake_256']
# 利用可能なアルゴリズム一覧
['blake2b', 'blake2b512', 'blake2s', 'blake2s256', 'md4', 'md5',
 'md5-sha1', 'ripemd160', 'sha1', 'sha224', 'sha256', 'sha3-224',
 'sha3-256', 'sha3-384', 'sha3-512', 'sha384', 'sha3_224',
 'sha3_256', 'sha3_384', 'sha3_512', 'sha512', 'sha512-224',
 'sha512-256', 'shake128', 'shake256', 'shake_128', 'shake_256',
 'sm3', 'whirlpool']

CentOS 7.5

CentOSでの実行結果
$ cat /etc/redhat-release
CentOS Linux release 7.5.1804 (Core) 

$ python3.6 -V
Python 3.6.5

$ python3.6 show_algos.py
# 保証されたアルゴリズム一覧
['blake2b', 'blake2s', 'md5', 'sha1', 'sha224', 'sha256', 'sha384',
 'sha3_224', 'sha3_256','sha3_384', 'sha3_512', 'sha512',
 'shake_128', 'shake_256']

# 利用可能なアルゴリズム一覧
['DSA', 'DSA-SHA', 'MD4', 'MD5', 'RIPEMD160', 'SHA', 'SHA1',
 'SHA224', 'SHA256', 'SHA384', 'SHA512', 'blake2b', 'blake2s',
 'dsaEncryption', 'dsaWithSHA', 'ecdsa-with-SHA1', 'md4', 'md5',
 'ripemd160', 'sha', 'sha1', 'sha224', 'sha256', 'sha384',
 'sha3_224', 'sha3_256', 'sha3_384', 'sha3_512', 'sha512',
 'shake_128', 'shake_256', 'whirlpool']
Ubuntuでの実行結果
$ cat /etc/os-release | grep "PRETTY_NAME"
PRETTY_NAME="Ubuntu 18.04.1 LTS"

$ python3 -V
Python 3.6.6

$ python3 show_algos.py
# Supported Algorithms Guaranteed
['blake2b', 'blake2s', 'md5', 'sha1', 'sha224', 'sha256', 'sha384',
 'sha3_224', 'sha3_256', 'sha3_384', 'sha3_512', 'sha512',
 'shake_128', 'shake_256']

# Supported Algorithms Available
['BLAKE2b512', 'BLAKE2s256', 'MD4', 'MD5', 'MD5-SHA1', 'RIPEMD160',
 'SHA1', 'SHA224', 'SHA256', 'SHA384', 'SHA512', 'blake2b',
 'blake2b512', 'blake2s', 'blake2s256', 'md4', 'md5', 'md5-sha1',
 'ripemd160', 'sha1', 'sha224', 'sha256', 'sha384', 'sha3_224',
 'sha3_256', 'sha3_384', 'sha3_512', 'sha512', 'shake_128',
 'shake_256', 'whirlpool']

ついでに Docker の Alpine Linux

Docker(python:alpine)での実行結果
$ docker run --rm -it python:alpine /bin/sh

/ # cat /etc/os-release | grep "PRETTY_NAME"
PRETTY_NAME="Alpine Linux v3.13"

/ # python3 -V
Python 3.9.5

/ # vi show_algos.py
...(ソースをコピペ) ..

/ # python3 show_algos.py
# 保証されたアルゴリズム一覧
['blake2b', 'blake2s', 'md5', 'sha1', 'sha224', 'sha256', 'sha384',
 'sha3_224', 'sha3_256', 'sha3_384', 'sha3_512', 'sha512',
 'shake_128', 'shake_256']
# 利用可能なアルゴリズム一覧
['blake2b', 'blake2s', 'md4', 'md5', 'md5-sha1', 'ripemd160',
 'sha1', 'sha224', 'sha256', 'sha384', 'sha3_224', 'sha3_256',
 'sha3_384', 'sha3_512', 'sha512', 'sha512_224', 'sha512_256',
 'shake_128', 'shake_256', 'sm3', 'whirlpool']

所感

以前「hash アルゴリズムとハッシュ値の長さ一覧」をまとめたのですが、それらの一覧は PHP7 でサポートされているアルゴリズムであったため、他のプログラム言語のハッシュ関数と共通のアルゴリズムを知りたいと思いました。

そこで、まずは最近勉強している Python3 のハッシュ関数用の hashlib モジュールから調べてみました。

参考文献

5
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
2