【发布时间】:2017-08-29 04:12:15
【问题描述】:
我想使用 python 来加密一些数据并且遇到了 pycrypto 作为一种可能的工具。为了加密数据,我需要:
- 输入密码字符串
- SHA-256 字符串,为 AES-256 提供密钥
- 将敏感数据表示为 9 位字符 (ascii) 的字符串,如果存在,则以 ascii 0 开头(数据将始终采用这种格式)。
- 在 ecb 模式下使用 AES-256、NO SALT、使用 RFC2315 中的 PKCS7 填充加密数据字符串。
- 将密文表示为 Base64 (RFC 4648),需要 24 个字符
使用 pycrypto,步骤 1-3 相当简单。 4给我带来了一点麻烦。我不确定 PKCS7 填充是什么,我不确定如何确保加密不使用 SALT。我希望有人能指出我正确的方向:第 4 步。
【问题讨论】:
-
Encrypt & Decrypt using PyCrypto AES 256 的可能重复项(参见 pad 和 unpad 功能)
-
A salt 在第 4 步中绝对没有意义。也许作者的意思是初始化向量 (IV),但这不可用,因为您正在尝试使用不使用四。 Salt 可能在第 2 步中有意义。这个提议的方案非常糟糕......
-
您永远不应该使用简单的哈希函数来保护您的用户密码。您需要使用强散列方案,如 PBKDF2、bcrypt、scrypt 和 Argon2。确保使用高成本因数/迭代次数。通常选择成本以使单次迭代至少需要 100 毫秒。查看更多:How to securely hash passwords?
-
切勿使用ECB mode。它是确定性的,因此在语义上不安全。您至少应该使用像CBC 或CTR 这样的随机模式。最好对您的密文进行身份验证,以免像padding oracle attack 这样的攻击是不可能的。这可以通过 GCM 或 EAX 等经过身份验证的模式或encrypt-then-MAC 方案来完成。
标签: python encryption padding pycrypto