Python:无法从hashlib导入scrypt

时间:2019-03-26 21:41:03

标签: python python-3.x openssl hashlib scrypt

我需要使用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)是什么?

1 个答案:

答案 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来说尤其重要, 许多参数不透明且难以验证。