当前位置: 首页 > 知识库问答 >
问题:

是否有可能在Python中对密码加密然后安全解密数据?

彭琛
2023-03-14

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

这个问题显示了一种不安全的方式,并建议使用LibNa。因为我在使用Python,所以我找到了pyNade。它似乎有很多从libnaid映射的函数,但我不知道如何简单地根据密码加密/解密数据。

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

要加密:

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

要解密:

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

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

共有1个答案

景高杰
2023-03-14

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

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

 类似资料:
  • 我正在尝试使用javax.crypto.ciper加密/解密数据,其中我将转换指定为aes/ecb/pkcs5padding。 在我的本地机器中,jcesecurity.isrestricted()返回FALSE,但是当它在服务器上运行时,相同的方法返回true。由于服务器上的这种情况,系统不会为密码分配正确的权限。 不确定,JceSecurity restriction确切设置在哪里。感谢你的帮

  • 我正在考虑使用ChaCha20-Poly1305来加密/解密密码(我需要加密/解密不能只哈希)。但是,要使用此算法,我们需要使用密钥。然而,这是一个问题,因为我正在他们的设备上加密/解密用户的密码,所以在我的数据库中,我只存储他们加密的密码。 问题是,如果用户从他们的手机上卸载我的应用程序或换成新手机,我需要相同的密钥才能再次解密用户的密码。 我的问题是:如何安全地传输和存储这个密钥? 另外,如果

  • 我理解哈希和加密之间的区别。我正在寻找一种在Python中实现加密/解密字符串的简单方法。我在网上找到的大多数方法都是关于使用散列算法(MD5-SHA-1等)来进行单向散列。但不幸的是,哈希是不可逆的。有什么建议吗?

  • 我想收集数据,并在一个加密的文件中写入使用公钥(在Android中)。然后将文件发送到PC机读取。在我的PC中,我也需要创建一个应用程序来解密文件。我该如何做以及如何安全地共享密钥?

  • Java安全加密专题文章索引 Java安全加密:对称加密 Java安全加密:非对称加密 Java安全加密:消息摘要Message Digest Java安全加密:数字签名和数字证书 Java安全加密:Https编程 1. 凯撒密码 1.1 概述 凯撒密码作为一种最为古老的对称加密体制,在古罗马的时候都已经很流行,他的基本思想是:通过把字母移动一定的位数来实现加密和解密。明文中的所有字母都在字母表上

  • 我的学校开始使用安全的考试浏览器作为在线考试的平台,我想了解更多。我试图了解它的配置文件是如何制作的,以及它们实际上包含什么,所以我开始从这里阅读文档,以便解密其中一个,但我没有做到这一点。你能告诉我去德赛普特a的程序吗。seb文件,假设这是可能的?