2012-01-06 2 views
2

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

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

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

ответ

4

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

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

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

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

2

Первый пункт Грега Хьюджилла стоит подчеркнуть. Я только что обнаружил, к моему удивлению, что на моем ноутбуке система 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, я мог бы просто быть monkeypatched hexdigest в старом.

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

+0

+1 за всегда равна –

2

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

1

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

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

Смежные вопросы