我需要使用scrypt算法,并且由于我已经在使用hashlib,所以我想出...为什么不呢?我已经检查过this,它指出必须使用OpenSSL 1.1+。另外,根据official doc:
hashlib.scrypt(密码,*,salt,n,r,p,maxmem = 0,dklen = 64)
...
可用性:OpenSSL 1.1 +。
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)
是什么?
答案 0 :(得分:1)
我的Mac正在运行OpenSSL 1.1.1 11 Sep 2018
。
我用python3.6复制了您的导入症状,
并发现scrypt
用python3.7导入就可以了。
您可以考虑尝试3.7。
签名中的*
是一种相对较新的语法
这标志着位置参数的结束。
因此,您不能以scrypt('secret', 'mySalt')
的身份调用。
您需要指定关键字args,例如scrypt('secret', salt='mySalt')
。
目的是使使用错误的arg顺序更难于错误地调用。
这对于加密API来说尤其重要,
许多参数不透明且难以验证。