我在python程序中有一些数据,我想在用密码写入文件之前对其进行加密,然后在使用之前将其读取并解密。我正在寻找一种可以加密和解密密码的安全对称算法。
This question显示了一种非安全的方式,建议使用libsodium。由于我使用的是Python,我找到了pysodium。似乎从libsodium映射了大量功能,但我不知道如何简单地加密/解密数据密码。
我的问题是看起来所有加密算法都使用密钥。我不想使用密钥。我想只使用密码。就像我在终端中所做的那样:
要加密:
$ cat data | openssl aes-256-cbc -salt | dd of=output.des3
要解密:
$ dd if=output.des3 | openssl aes-256-cbc -d -salt
是否可以通过pysodium执行此操作(跨平台方式,所以请不要建议使用系统调用)?
答案 0 :(得分:4)
所以我的问题简化为:"如何根据Python中的密码加密数据"。由于缺乏文件,我放弃了pysodium。我使用cryptography
和argon2
包来编写我自己的加密算法(它不是我自己的加密算法,我知道加密算法中的第1号规则;它只是程序到利用已有的东西)。所以这是我的功能:
import cryptography.fernet
import argon2
import base64
def encrypt_data(data_bytes, password, salt):
password_hash = argon2.argon2_hash(password=password, salt=salt)
encoded_hash = base64.urlsafe_b64encode(password_hash[:32])
encryptor = cryptography.fernet.Fernet(encoded_hash)
return encryptor.encrypt(data_bytes)
def decrypt_data(cipher_bytes, password, salt):
password_hash = argon2.argon2_hash(password=password, salt=salt)
encoded_hash = base64.urlsafe_b64encode(password_hash[:32])
decryptor = cryptography.fernet.Fernet(encoded_hash)
return decryptor.decrypt(cipher_bytes)
以下是如何使用它们的示例:
cipher = encrypt_data("Hi Dude, Don't tell anyone I said Hi!".encode(), "SecretPassword", "SaltySaltySalt")
decrypted = decrypt_data(cipher, "SecretPassword", "SaltySaltySalt")
print(cipher)
print(decrypted.decode())
请记住,加密仅适用于字节;不是为了字符串。这就是我使用encode
/ decode
。
为什么选择argon2?因为它是一种内存硬算法,很难打破GPU和ASIC(是的,我是加密货币迷)。
为何选择Fernet?因为它使用AES CBC,这似乎足够安全;此外,它真的很容易使用(这正是我需要的......我不是一个密码学家,所以我需要一个黑盒子来使用)。
免责声明:请注意,我不是密码学家。我只是一名程序员。请随意批评我的加密和解密方式,请随时添加您的贡献以使其更好。