我经常使用codeigniter,但是我并不理解为什么当我在版本3中使用加密库时,加密字符串永远不会出现相同的情况,即使使用相同的salt / key。
所以我将用户密码存储为加密字符串,使用自己的密钥进行加密。密钥存储在数据库中。但是当他们登录时,我想加密输入的密码以检查字符串匹配,他们永远不会匹配!
似乎库总是吐出不同的加密字符串,无论密钥是否相同,如果我无法将存储的加密密码与他们在登录时输入的密码相匹配,这将如何有用?
例如,密码为12456,密钥为a0956f251b9d957071005a2d11e4630a
保存的密码IS:0e6effa48949d6bf19e84530bc86e9a1407086b3b88fc368b6f8b7b53304b313eeebdb695c9cca10b3e7072f608bf4137e7fcc7d24fed54df2b6dcba3f94dcb6Tm05Qmay9G8JuUXps6UstWebmBmJ71BcIPgrW78OvSY =
从用户登录生成的密码
6b893dac92155bc663b126b805c7189214ac4667b226f0c6fc22cf0c6bcca5e897c49961e8852ade1c3e85cbecab89df76ea7891727af6bf0bcc232b75d0d441LLUMZgOy4zLwAypuVQuK0lKTXrlXYptKpVdByytH2D8 =
935c8f564c4a5ecb53510faa835eca8622069c34d534df6b9c2ea52de2d9bea5976128f6ff83a572ac677be4ebd690bc18e488518c2eed8b1b40a16c9e61d6b2hbKJ6B1VDuLPCXBeDDFzvrlSBIYCtN19M6dQGZRCvUE =
b8e020c7c10d564cfc3a9cc4d50b85ea3422422b73a2dd79930ead1fb601493279ba97645584d6dfa188e62f5eba5dc66d0dafdb7a82c08bf847bc84fc0718daSOVRrDlFmVMB / 12ok9kR68ekXJcJvw0yfo / cnU9ojtI =
每次尝试加密用户输入时,看到它们有所不同吗?这没有任何意义。
同样,如果我尝试解码数据库中的密码,使用相同的密钥加密,我什么也得不到,没有解密的密码。
那么,有谁知道这里发生了什么?
答案 0 :(得分:4)
随机加密是实现语义安全性所必需的安全属性。如果加密不是随机的,则攻击者可能仅通过观察密文来检测先前是否发送了(前缀)消息。除了篇幅之外,你通常不希望攻击者知道关于明文的任何事情。
加密功能始终具有相应的解密功能。您似乎只使用这两种功能中的一种方式。您永远不应该加密用户的密码。您需要使用散列,而使用一些强大的散列是PBKDF2,bcrypt,scrypt和Argon2。由于散列函数是单向函数,因此您无法解密"解密"哈希。为了验证您的用户,您可以再次通过散列函数运行密码,以便与存储在数据库中的散列进行比较。查看更多:How to securely hash passwords?
答案 1 :(得分:1)
Codigniter文件:
请勿将此密码或任何其他加密库用于用户密码 存储!密码必须经过哈希处理,您应该通过 PHP自己的密码哈希扩展。
http://www.codeigniter.com/userguide3/libraries/encryption.html
在此完全解释:
答案 2 :(得分:-2)
尝试md5加密它的优点和最佳直到现在。 在控制器之前发送密码如下:
md5($this->input->post('password));
或使用hash()
或SHA256/SHA512
他们做得很好。
它会起作用。
享受!