Python: невозможно импортировать scrypt из hashlib - PullRequest
1 голос
/ 27 марта 2019

Мне нужно использовать алгоритм scrypt, и, поскольку я уже использую hashlib, я решил ... почему бы и нет?Я уже проверил этот , и он указал, что OpenSSL 1.1+ был необходим.Также, согласно официальному документу :

hashlib.scrypt (пароль, *, соль, 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 Ответ

1 голос
/ 27 марта 2019

Мой Mac работает с OpenSSL 1.1.1 11 Sep 2018.Я воспроизвел ваши симптомы импорта с помощью python3.6 и обнаружил, что scrypt импортируется очень хорошо с python3.7.Вы можете попробовать 3.7.

. * в сигнатуре - это относительно новый синтаксис, обозначающий конец позиционных аргументов.Так что вы не можете ссылаться как scrypt('secret', 'mySalt').Вам необходимо указать аргументы ключевых слов, например scrypt('secret', salt='mySalt').Намерение состоит в том, чтобы затруднить неправильный вызов, используя ошибочный порядок аргументов.Это, как правило, особенно важно для крипто-API, где многие из аргументов непрозрачны и их трудно проверить.

...