繁体   English   中英

是否有可能加密然后根据Python中的密码安全地解密数据?

[英]Is it possible to encrypt then decrypt data securely against a password in Python?

我在python程序中有一些数据,我想在用密码写入文件之前加密,然后在使用它之前读取并解密它。 我正在寻找一些可以加密和解密密码的安全对称算法。

这个问题显示了一种不安全的方式,建议使用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进行此操作(跨平台方式,所以请不要建议使用系统调用)?

所以我的问题简化为:“如何在Python中对密码加密数据”。 由于缺乏文件,我放弃了pysodium。 我使用cryptographyargon2包来编写我自己的加密算法(这不是我自己的加密算法,我知道加密中的第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,这似乎足够安全; 此外,它真的很容易使用(这正是我需要的......我不是密码学家,所以我需要一个黑盒子才能使用)。

免责声明:请注意,我不是密码学家。 我只是一个程序员。 请随意批评我的加密和解密方式,请随时添加您的贡献以使其更好。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM