Python Hashlib Возвращение разных значений [дубликат]

посмотрите на /etc/php.ini, там:

; This directive allows you to disable certain functions for security reasons.
; It receives a comma-delimited list of function names. This directive is
; *NOT* affected by whether Safe Mode is turned On or Off.
; http://www.php.net/manual/en/ini.sect.safe-mode.php#ini.disable-functions
disable_functions =

убедитесь, что exec не указан в следующем виде:

disable_functions=exec

Если это так, удалите его и перезагрузите apache.

Для легкой отладки я обычно обычно запускаю файл php вручную (может запрашивать больше ошибок, не устанавливая его в основном ini). для этого добавьте заголовок:

#!/usr/bin/php
ini_set("display_errors", 1);
ini_set("track_errors", 1);
ini_set("html_errors", 1);
error_reporting(E_ALL);

в начало файла, дайте ему разрешения с помощью chmod +x myscript.php и выполните его ./myscript.php. Он очень внимателен, особенно на занятом сервере, который много пишет в файле журнала.

EDIT

Звучит как проблема с разрешениями. Создайте сценарий bash, который делает что-то простое как echo "helo world" и попытается запустить его. Убедитесь, что у вас есть разрешения для файла и папки, содержащей файл. вы можете просто сделать chmod 755 только для тестирования.

1
задан mushi.f 29 April 2017 в 15:19
поделиться

1 ответ

Что вам не хватает, так это то, что hash.update() не заменяет хешированные данные. Вы постоянно обновляете хэш-объект, так что вы получаете хэш из конкатенированных строк . Из документации hashlib.hash.update() :

Обновите хэш-объект со строкой arg . Повторные вызовы эквивалентны одному вызову с конкатенацией всех аргументов: m.update(a); m.update(b) эквивалентен m.update(a+b).

Смелый акцент мой.

Итак, вы не получаете хеш одной строки 'stackoverflow', вы получаете хэш сначала из 'stackoverflow', затем из 'stackoverflowstackoverflow', затем 'stackoverflowstackoverflowstackoverflow' и т. д., каждый раз, когда добавляет другой 'stackoverflow', создавая более длинную и длинную строку. Ни одна из этих более длинных строк не равна исходной короткой строке, поэтому их хэши вряд ли будут одинаковыми.

Создайте новый объект new для новых строк:

>>> import hashlib
>>> m = hashlib.md5()
>>> m.update('stack' + 'overflow')
>>> m.hexdigest()
'73868cb1848a216984dca1b6b0ee37bc'
>>> m = hashlib.md5()   # **new** hash object
>>> m.update('stackoverflow')
>>> m.hexdigest()
'73868cb1848a216984dca1b6b0ee37bc'
>>> m = hashlib.md5()     # new object again
>>> m.update('stack')     # add the string in pieces, part 1
>>> m.update('overflow')  # and part 2
>>> m.hexdigest()
'73868cb1848a216984dca1b6b0ee37bc'

Вы можете легко создать свои «неправильные» хэши, отправив в конкатенированные данные:

>>> m = hashlib.md5()
>>> m.update('stackoverflowstackoverflow')
>>> m.hexdigest()
'458b7358b9e0c3f561957b96e543c5a8'
>>> m = hashlib.md5()
>>> m.update('stackoverflowstackoverflowstackoverflow')
>>> m.hexdigest()
'65b0e62d4ff2d91e111ecc8f27f0e8f5'
>>> m = hashlib.md5()
>>> m.update('stackoverflow' * 4)
>>> m.hexdigest()
'60c3ae3dd9a2095340b2e024194bad3c'

Обратите внимание, что вы также можете передать первую строку в функцию md5():

>>> hashlib.md5('stackoverflow').hexdigest()
'73868cb1848a216984dca1b6b0ee37bc'

Обычно вы используете метод hash.update(), только если вы обрабатываете данные в кусках (например, чтение строки по строке или чтение блоков данных из сокета) и не хотите, чтобы для одновременного хранения всех этих данных в памяти.

7
ответ дан Martijn Pieters 16 August 2018 в 05:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: