Безопасность Python sha512

Мне было интересно, будет ли это безопасным методом аутентификации:

theInput = raw_input("Enter password: ")
theHashed = hashlib.sha512(theInput).hexdigest()
if theHashed == "35211b890b19afebfabc3451f04d150f1423bcb54ff7d62095677d7af7560fcvb56c112e879288836cb506853516c5dbd1d779cfaedf4a2f6f6a303600c0c589":
    print "Correct!"

Если нет, что я могу сделать, чтобы сделать его более безопасным?


person tkbx    schedule 06.01.2012    source источник


Ответы (4)


Возможно, если кто-то не сможет прочитать или изменить ваш код.

В случае, если это программа, которая запускается локально на одном компьютере, и файл установлен таким образом, что обычные пользователи не могут его изменить, и вы знаете, что кейлоггер не установлен, то, возможно, все в порядке.

Даже если пользователь может прочитать этот файл, он может сделать копию и изменить свою копию, чтобы удалить этап аутентификации.

Безопасность программ — сложная и глубокая тема, выходящая за рамки простого выбора алгоритма хеширования.

person Greg Hewgill    schedule 06.01.2012

Стоит подчеркнуть первый пункт Грега Хьюгилла. Я только что обнаружил, к своему удивлению, что на моем ноутбуке система hashlib.py открыта для всего мира. Соответственно, обойти вышеуказанную аутентификацию тривиально:

localhost-2:coding $ cat hashcrack.py 
class always_equal(object):
    def __eq__(self, other):
        return True

class sha512(object):
    def __init__(self, password):
        pass
    def hexdigest(self):
        return always_equal()
localhost-2:coding $ cat hashcrack.py >> /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/hashlib.py
localhost-2:coding $ cat notsosecure.py 
import hashlib
theInput = raw_input("Enter password: ")
theHashed = hashlib.sha512(theInput).hexdigest()
if theHashed == "35211b890b19afebfabc3451f04d150f1423bcb54ff7d62095677d7af7560fcvb56c112e879288836cb506853516c5dbd1d779cfaedf4a2f6f6a303600c0c589":
    print "Correct!"
localhost-2:coding $ python notsosecure.py 
Enter password: pwned
Correct!

Если подумать, мне даже не нужно было создавать новый класс sha512, я мог просто пропатчить hexdigest в старом.

В любом случае, +1 к тому, что не количество битов в вашем хэше является доминирующей угрозой безопасности.

person DSM    schedule 06.01.2012

Используйте import getpass, а затем theInput = getpass.getpass("Enter password: ") вместо raw_input().

person John Paul    schedule 06.01.2012

Для аутентификации по паролю в целом вам следует больше думать о KDF, таких как PBKDF2 и scrypt. Вы также должны проверить новую криптографическую библиотеку:

https://cryptography.io/en/latest/

person kgriffs    schedule 09.01.2014