Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中,是否可以使用密码安全地加密然后解密数据?_Python_Python 3.x_Encryption_Openssl - Fatal编程技术网

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

在Python中,是否可以使用密码安全地加密然后解密数据?,python,python-3.x,encryption,openssl,Python,Python 3.x,Encryption,Openssl,我在python程序中有一些数据,我想在使用密码写入文件之前对其进行加密,然后在使用之前读取并解密。我正在寻找一些安全的对称算法,可以根据密码进行加密和解密 显示了一种不安全的方式,并建议使用LibNade。因为我使用的是Python,所以我发现。它似乎有很多从libnaid映射的函数,但我不知道如何简单地根据密码加密/解密数据 我的问题是,看起来所有加密算法都使用密钥。我不想用钥匙。我只想使用密码。就像我在航站楼做的一样: 要加密: $ cat data | openssl aes-256-c

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

显示了一种不安全的方式,并建议使用LibNade。因为我使用的是Python,所以我发现。它似乎有很多从libnaid映射的函数,但我不知道如何简单地根据密码加密/解密数据

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

要加密:

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

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

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

因此我的问题简化为:“如何使用Python中的密码加密数据”。由于缺乏文档,我放弃了PySnaid。我使用
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())
记住,加密只针对字节;不适用于字符串。这就是我使用
编码
/
解码
的原因

为什么是argon2?因为它是一种内存硬算法,很难用GPU和ASIC来破解(是的,我是加密货币迷)

为什么是费内特?因为它使用AES CBC,这似乎足够安全;此外,它真的很容易使用(这正是我所需要的……我不是密码学家,所以我需要一个黑匣子来使用)


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

1。加密是基于数据的,这意味着8位字节,而不是字符,密钥的长度必须正确。2.如果您想使用密码,则需要从加密散列中派生密钥,而通常的方法是加密散列,为了确保安全,需要消耗约100ms的CPU时间,选择的方法是PBKDF2。CPU烧录是必要的,因为一般情况下,密码是不安全的,它们是对频繁使用的密码列表强制执行的。3.3DES,不是AES,真的吗?@zaph谢谢你的回复。你说得对。我要换成那样了。我目前也在研究PBKDF2。但与此同时,为什么要区分字符和字节呢?难道我们不需要解决这个问题吗?还有彩虹桌。。。好。。。这不是我们用盐的原因吗?为什么密码即使用盐(必要时用胡椒粉)也不安全?如果我问的是明显的问题,请原谅我对这件事的无知。我错过了什么明显的东西吗?@JamesKPolk谢谢你的帮助。。。由于某些原因,当我运行
crypto\pwhash
时,我不断收到“不支持的版本”错误。。。不知道为什么或如何,缺少文档真的很令人恼火。我做的和我想做的完全相反。。。我希望我能找到一个单行程序来加密我的数据和一个单行程序来解密它,但由于某种原因,这是不存在的。现在我正在处理python的加密包。。。也许这样就行了。如果你解决了你的问题,请把你的答案贴出来problem@IamTheWalrus我正在考虑使用Argon2散列我的密码,然后将其用作密钥。我正在研究它。我不确定我是否理解为什么要对Argon2的结果进行base64编码。我假设
Fernet
的参数很可能是AES密钥,是吗?如果是这样,您传递的字节太多了。@LukeJoshuaPark Fernet在该函数中占用的字节数不超过32个,所以我只是将其裁剪为32个。Fernet通常将自己的
generate_key()
static方法的结果作为其密钥,我检查了该方法,发现它使用b64encode对随机数进行编码。所以我所做的就是,我使用了他们相同的方式,只是输入是Argon2散列,以确保散列的可复制性,而不是生成随机键。@LukeJoshuaPark我以前试过这个。它给出错误:
Fernet键必须是32个url安全的base64编码字节。
ValueError:Fernet键必须是32个url安全的base64编码字节。
。我不知道怎么做。啊,好的。这很奇怪。Crypto Nommally需要原始字节。。。奇怪的是,这需要一个base-64字符串。我想那是你的巨蟒@IamTheWalrus trimming Hash是密码学中的一种正常做法,除了从数学角度增加碰撞概率这一明显且可忽略的事实外,它没有任何不良副作用。我看到这件事一直在做。