代码之家  ›  专栏  ›  技术社区  ›  The Quantum Physicist

在Python中,是否可以根据密码安全地加密然后解密数据?

  •  3
  • The Quantum Physicist  · 技术社区  · 6 年前

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

    This question 显示了一种不安全的方式,并建议使用LibNadium。由于我使用Python,我发现 pysodium 。它似乎有很多从libnail映射的函数,但我不知道如何根据密码简单地加密/解密数据。

    我的问题是,似乎所有加密算法都使用密钥。我不想用钥匙。我想 只有 使用密码。就像我在航站楼做的那样:

    要加密:

    $ cat data | openssl aes-256-cbc -salt | dd of=output.des3
    

    要解密:

    $ dd if=output.des3 | openssl aes-256-cbc -d -salt
    

    有没有可能用pynaid实现这一点(以跨平台的方式,所以请不要建议使用系统调用)?

    1 回复  |  直到 6 年前
        1
  •  5
  •   The Quantum Physicist    6 年前

    因此,我的问题归结为:“如何使用Python中的密码加密数据”。由于缺乏文档,我放弃了Pysina。我用过 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,这似乎足够安全;此外,它真的很容易使用(这正是我所需要的……我不是密码学家,所以我需要一个黑匣子来使用)。

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