python - 是否可以根据 Python 中的密码安全地加密然后解密数据?

标签 python python-3.x encryption openssl

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

This question显示了一种不安全的方式并建议使用 libsodium。因为我使用的是 Python,所以我找到了 pysodium .它似乎有大量从 libsodium 映射的功能,但我不知道如何根据密码简单地加密/解密数据。

我的问题是,看起来所有加密算法都使用 key 。我不想用 key 。我只想使用密码。就像我在终端中所做的那样:

加密:

$ 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 包编写了我自己的加密算法(这不是我自己的加密算法,我知道加密中的第一条规则;这只是利用什么的过程已经在那了)。所以这是我的功能:

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,看起来足够安全;此外,它真的很容易使用(这正是我所需要的......我不是密码学家,所以我需要一个黑盒子来使用)。

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

关于python - 是否可以根据 Python 中的密码安全地加密然后解密数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49465692/

相关文章:

python - Selenium 抓取 JavaScript 元素

python - python3中的循环比python2慢得多

python - 云功能中的 spacy 模型不起作用

python - asyncio Queue.get 延迟

python - 私有(private)属性和设置限制

c# - C# 默认使用的 RSA 算法是什么,它在 Crypto++ 中的合适参数是什么?

swift - 使用 CryptoSwift 和 CryptoJS 的 AES 加密

python - savetxt 到文件给出错误

python - 多数元素 python

java - Android加密数据库