Является ли эта функция пароля с sha256 и PBKDF2HMAC солью безопасной для шифрования ваших локальных паролей на python?

#python #security #encryption #passwords

Вопрос:

В настоящее время я работаю над способом безопасного хранения моих личных ключей в приложении для чата, которое я создаю. Я хочу найти способ для шифрования ключей с помощью пароля, так что если кто-то получит доступ к моему компьютеру у них нет моих ключей для использования и во время входа в систему я могу ввести свой пароль, чтобы расшифровать ключи и воспользоваться ими.
Я нашел эту функцию пароля, используя SHA256 с PBKDF2HMAC с 100000 итераций и соли, но мне интересно, насколько безопасно это, и если кто-то может взломать его с перебором предполагали IAM с помощью пароля не менее 8 обозначения на клавишах с буквами и цифрами.

Это всего лишь демонстрация:

 import base64
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC
from cryptography.fernet import Fernet
import secrets

password_file = b'My list with passwords.'
login_salt = secrets.token_hex(16).encode()
 

во время входа в систему

 def login(crypt_info):
    password = input("Enter password to login:").encode()
    kdf = PBKDF2HMAC(
        algorithm=hashes.SHA256,
        length=32,
        salt=login_salt,
        iterations=100000,
        backend=default_backend(),
    )
    decryption_key = (base64.urlsafe_b64encode(kdf.derive(password)))
    decryption_key_fernet = Fernet(decryption_key)
    decrypt_info = decryption_key_fernet.decrypt(crypt_info).decode()
    print(decrypt_info)
 

ключи шифрования

 def encrypt():
    password = input("Enter password to register:").encode()
    kdf = PBKDF2HMAC(
        algorithm=hashes.SHA256,
        length=32,
        salt=login_salt,
        iterations=100000,
        backend=default_backend(),
    )
    encryption_key = (base64.urlsafe_b64encode(kdf.derive(password)))
    encryption_key_fernet = Fernet(encryption_key)
    encrypt_info = encryption_key_fernet.encrypt(password_file)
    print(encrypt_info)
    login(encrypt_info)


encrypt()
 

Комментарии:

1. Теперь речь идет о силе вашего пароля. Хороший пароль, подобный тем, которые были сгенерированы с помощью dicewire, может оказаться недоступным для любого поиска. См. XKCD 936