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 尤其重要,
其中许多参数不透明且难以验证。
我需要使用 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 尤其重要,
其中许多参数不透明且难以验证。