Python: 无法从 hashlib 导入 scrypt

Python: cannot import scrypt from hashlib

我需要使用 scrypt 算法,因为我已经在使用 hashlib,所以我想...为什么不呢?我已经检查过 this and it pointed out OpenSSL 1.1+ was necessary. Also, according to official doc:

hashlib.scrypt(password, *, salt, n, r, p, maxmem=0, dklen=64)

...

Availability: OpenSSL 1.1+.

New in version 3.6.

我确保拥有最新版本的 openssl:

# openssl version
OpenSSL 1.1.1b  26 Feb 2019

我也试过 运行 python3.6 和 python3 (3.4) 并且都说他们不能导入 scrypt:

# python3.6
Python 3.6.5 (default, Apr 10 2018, 17:08:37)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-16)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from hashlib import pbkdf2_hmac
>>> from hashlib import scrypt
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: cannot import name 'scrypt'

如您所见,pbkdf2_hmac 等其他方法也有效。有什么问题吗?

另外,hashlib.scrypt(password, *, salt, n, r, p, maxmem=0, dklen=64)中的*是什么?

我的 mac 是 运行 OpenSSL 1.1.1 11 Sep 2018。 我用 python3.6 重现了你的导入症状, 并发现 scrypt 与 python3.7 导入得很好。 您可以考虑尝试 3.7.

签名中的*是比较新的语法 这标志着位置参数的结束。 所以你不能调用为 scrypt('secret', 'mySalt')。 您需要指定关键字参数,例如scrypt('secret', salt='mySalt')。 目的是通过使用错误的 arg 顺序更难调用错误。 这对于加密 API 尤其重要, 其中许多参数不透明且难以验证。