openssl sha1 дает разные результаты в терминале по сравнению с Python - PullRequest
0 голосов
/ 12 октября 2018

Я пытаюсь запустить команду openssl из скрипта Python, но получаю разные значения sha1 из команды, выполняемой в скрипте, и команды, выполняемой непосредственно в терминале.

Вот мой код:

command = "echo -n '" + hex(key)[2:] + "' | openssl sha1"
print(command)
os.system(command)
output = subprocess.check_output(command, shell=True)
# This converts the bytes object to a string.
output = output.decode("utf-8")
print(output)

os.system(command) только для проверки того, дают ли этот метод и subprocess.check_output() одинаковый результат.

Вот выходные данные программы для примера ввода key=0xabc:

echo -n 'abc' | openssl sha1
(stdin)= 9d4fe92b8bdc894f5838fad83108bf3841b257fa
(stdin)= 9d4fe92b8bdc894f5838fad83108bf3841b257fa

Первая строка - это команда, которая должна быть выполнена, вторая - результат команды, использующей os.system (), а третья - результат команды, использующей subprocess.check_output ().Как видите, оба метода дают один и тот же результат.

Теперь, если я скопирую и вставлю команду, как показано здесь, и выполню ее в терминале, это будет результат:

(stdin)= a9993e364706816aba3e25717850c26c9cd0d89d

Несмотря на то, что я копирую и вставляю одну и ту же команду, вывод хэш-значения отличается.

Даже более странно, если я опускаю параметр -n в echo, несоответствия нет:

echo 'abc' | openssl sha1
(stdin)= 03cfd743661f07975fa2f1220c5194cbaff48451
(stdin)= 03cfd743661f07975fa2f1220c5194cbaff48451

И в терминале:

(stdin)= 03cfd743661f07975fa2f1220c5194cbaff48451

Все, что я читал в Интернете о подобных проблемах, связано с тем, что он не использует -n, а не -n, по-видимому, вызывающий проблему.Для конкретной задачи, которую я делаю, я должен использовать -n, так как я вычисляю предварительное изображение хеша, которое было вычислено с использованием echo -n "hash_value" | openssl sha1.

Любая помощь будет принята с благодарностью:)

1 Ответ

0 голосов
/ 12 октября 2018

TL; DR : использовать /bin/echo

Объяснение :

Системная команда python, вероятно, использует оболочку по умолчанию /bin/sh которая обычно связана с POSIX-совместимой оболочкой, в то время как ваша терминальная сессия использует оболочку входа вашего пользователя, что вероятно bash.Стандарт оболочки POSIX не поддерживает опцию -n для встроенной функции echo.Это означает, что вы буквально вычисляете дайджест «-n abc».Вы можете воспроизвести это как bash:

echo "-n abc" | openssl sha1
9d4fe92b8bdc894f5838fad83108bf3841b257fa

Бинарный исполняемый файл все еще доступен, но его необходимо будет вызывать по полному пути, поскольку встроенная оболочка переопределит его.Вместо echo используйте /bin/echo.

...