Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 28, 2020 12:44:13

ffrr
Зарегистрирован: 2020-10-22
Сообщения: 69
Репутация: +  0  -
Профиль   Отправить e-mail  

сравнение введенного пароля с паролем из MariaDB

В MariaDB пароль хранится в SHA1.
При запуске скрипта

  #!/usr/bin/python
import pymysql
import getpass
import uuid
 
print("-------------------------")
print("<<<<<<<<<Welcome>>>>>>>>>")
print("-------------------------")
username = input("Username:")
db = pymysql.connect("hostname","user","pass","db")
                                               
# prepare a cursor object using cursor() method
cursor = db.cursor()                                      
                                                          
cursor.execute("SELECT userID, password from permissions")
data = cursor.fetchone()
dbuser, dbpass = str(data[0]), data[1]
print(data)
print(dbuser)
print(dbpass)
if username == dbuser :
        password = getpass.getpass(prompt="Enter secret password:")
else :
    print ("please try another user name. This user name is incorrect")
def hash_password(password):
    salt = uuid.uuid4().hex
    return hashlib.sha1(salt.encode() + password.encode()).hexdigest() + ':' + salt
    
def check_password(hashed_password, user_password):
    password, salt = hashed_password.split(':')
    return password == hashlib.sha1(salt.encode() + user_password.encode()).hexdigest()
new_pass = input('Enter password: ') 
hashed_password = hash_password(new_pass) 
print('String for saving in database: ' + hashed_password) 
old_pass = input('Enter password again for check: ') 
if check_password(hashed_password, dbpass):
    print('Your password is correct')
else:
    print('Sorry, password don\'t match')

даже если я ввожу верный пароль дважды, пишет, что пароль не совпадает:

 -------------------------
<<<<<<<<<Welcome>>>>>>>>>
-------------------------
Username:659605758501
(659605758501, 'd399dc6259ca2df564e0b939abc334ffd77e41d8')
659605758501
d399dc6259ca2df564e0b939abc334ffd77e41d8
Enter secret password:
Enter password: my_password
String for saving in database: 9e691d981f2c5d240e27ba5d499b695693da6b8f:ab8ae339f01d43a7b8f9dda6ddda545a
Enter password again for check: my_password
Sorry, password don't match

здесь я ввожу my_password как просто пароль (не SHA1).
А если я введу SHA1 от пароля, как записано в БД, то пишет, что пароль совпадает:
 -------------------------
<<<<<<<<<Welcome>>>>>>>>>
-------------------------
Username:659605758501
(659605758501, 'd399dc6259ca2df564e0b939abc334ffd77e41d8')
659605758501
d399dc6259ca2df564e0b939abc334ffd77e41d8
Enter secret password:
Enter password: d399dc6259ca2df564e0b939abc334ffd77e41d8
String for saving in database: 7f9879cbf1eae806be740254ec4d317ec068186f:da179b81f6cc4cfab5693ead0227583f
Enter password again for check: d399dc6259ca2df564e0b939abc334ffd77e41d8
Your password is correct

Как правильно сравнивать SHA1 от пароля, который записан в БД с вводимым паролем?

Отредактировано ffrr (Окт. 28, 2020 12:46:17)

Офлайн

#2 Окт. 28, 2020 12:56:03

ffrr
Зарегистрирован: 2020-10-22
Сообщения: 69
Репутация: +  0  -
Профиль   Отправить e-mail  

сравнение введенного пароля с паролем из MariaDB

Попробовал так:

   #!/usr/bin/python
import pymysql
import getpass
import uuid
 
print("-------------------------")
print("<<<<<<<<<Welcome>>>>>>>>>")
print("-------------------------")
username = input("Username:")
db = pymysql.connect("hostname","user","pass","db")
                                               
# prepare a cursor object using cursor() method
cursor = db.cursor()                                      
                                                          
cursor.execute("SELECT userID, password from permissions")
data = cursor.fetchone()
dbuser, dbpass = str(data[0]), data[1]
print(data)
print(dbuser)
print(dbpass)
if username == dbuser :                                               
        password = getpass.getpass(prompt="Enter secret password:")   
        def hash_password(password):                                  
                salt = uuid.uuid4().hex                               
                return hashlib.sha1(salt.encode() + password.encode()).hexdigest() + ':' + salt
                                                                                               
        def check_password(hashed_password, user_password):                                    
                password, salt = hashed_password.split(':')                                    
                return password == hashlib.sha1(salt.encode() + user_password.encode()).hexdigest()
                                                                                                   
#new_pass = input('Enter password: ')                                                              
#hashed_password = hash_password(new_pass)                                                         
        hashed_password = hash_password(password)                                                  
        print('String for saving in database: ' + hashed_password)                                 
        old_pass = input('Enter password again for check: ')                                       
                                                                                                   
        if check_password(hashed_password, dbpass):                                                
                print('Your password is correct')                                                  
        else:                                                                                      
                print('Sorry, password don\'t match')                                              
else :                                                                                             
    print ("please try another user name. This user name is incorrect")      

тоже пароли не совпадают:
 -------------------------
<<<<<<<<<Welcome>>>>>>>>>
-------------------------
Username:659605758501
(659605758501, 'd399dc6259ca2df564e0b939abc334ffd77e41d8')
659605758501
d399dc6259ca2df564e0b939abc334ffd77e41d8
Enter secret password:
String for saving in database: 7abf5b2d5e0be1b5b820d2d851de05f9cc80ec91:f2a41829db8742d4a024580fcc1b6d63
Enter password again for check: my_password_as_text
Sorry, password don't match

Офлайн

#3 Окт. 28, 2020 12:58:04

ffrr
Зарегистрирован: 2020-10-22
Сообщения: 69
Репутация: +  0  -
Профиль   Отправить e-mail  

сравнение введенного пароля с паролем из MariaDB

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

 -------------------------
<<<<<<<<<Welcome>>>>>>>>>
-------------------------
Username:659605758501
(659605758501, 'd399dc6259ca2df564e0b939abc334ffd77e41d8')
659605758501
d399dc6259ca2df564e0b939abc334ffd77e41d8
Enter secret password:
String for saving in database: 3e2b2e4a8e2a45eb373f00e0f28ae2ac08953a05:57ad6fd53eed4e6d83241d67e45a6f94
Enter password again for check: d399dc6259ca2df564e0b939abc334ffd77e41d8
Your password is correct

Офлайн

#4 Окт. 28, 2020 23:23:00

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9715
Репутация: +  842  -
Профиль   Отправить e-mail  

сравнение введенного пароля с паролем из MariaDB

ffrr
Как правильно сравнивать SHA1 от пароля, который записан в БД с вводимым паролем?
Надо из вводимого пароля получить значение SHA1.

Только тупость с двоеточием и солью убери из проверки пароля на соответствие.

Ты должен ввести строку пароля, потом строка пароля должна преобразоваться в строку пароля, сохранённого в базе данных. Пока ты не преобразовал вводимую строку в пароль, совпадающий с паролем в базе данных, ты ничего не ввёл ещё. А как там и что называется, пароль строковый или пароль хешированный, абсолютно не важно. Пароль - это то, что хранится в базе данных. По-научному это называется “секрет”. Все действия, проводимые до получения секрета, ничего не значат.



Офлайн

#5 Окт. 29, 2020 09:05:25

ffrr
Зарегистрирован: 2020-10-22
Сообщения: 69
Репутация: +  0  -
Профиль   Отправить e-mail  

сравнение введенного пароля с паролем из MariaDB

спасибо, у меня вышло таким образом:

                 if username == dbuser :                                                                         
                        while True:                                                                                     
                                password = getpass.getpass(prompt="Enter secret password:")                     
                                                                                                                        
                                if (hashlib.sha1(password.encode()).hexdigest() == dbpass):                             
                                        print("Authentication success")                                                 
                                        break                                                                           
                                else:                                                                                   
                                        print("Bad password")                                                           

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version