CodeIgniter - 为什么使用相同的密钥加密会产生不同的结果?

时间:2016-01-09 11:37:42

标签: php codeigniter security encryption cryptography

我经常使用codeigniter,但是我并不理解为什么当我在版本3中使用加密库时,加密字符串永远不会出现相同的情况,即使使用相同的salt / key。

所以我将用户密码存储为加密字符串,使用自己的密钥进行加密。密钥存储在数据库中。但是当他们登录时,我想加密输入的密码以检查字符串匹配,他们永远不会匹配!

似乎库总是吐出不同的加密字符串,无论密钥是否相同,如果我无法将存储的加密密码与他们在登录时输入的密码相匹配,这将如何有用?

例如,密码为12456,密钥为a0956f251b9d957071005a2d11e4630a

保存的密码IS:0e6effa48949d6bf19e84530bc86e9a1407086b3b88fc368b6f8b7b53304b313eeebdb695c9cca10b3e7072f608bf4137e7fcc7d24fed54df2b6dcba3f94dcb6Tm05Qmay9G8JuUXps6UstWebmBmJ71BcIPgrW78OvSY =

从用户登录生成的密码

6b893dac92155bc663b126b805c7189214ac4667b226f0c6fc22cf0c6bcca5e897c49961e8852ade1c3e85cbecab89df76ea7891727af6bf0bcc232b75d0d441LLUMZgOy4zLwAypuVQuK0lKTXrlXYptKpVdByytH2D8 =

935c8f564c4a5ecb53510faa835eca8622069c34d534df6b9c2ea52de2d9bea5976128f6ff83a572ac677be4ebd690bc18e488518c2eed8b1b40a16c9e61d6b2hbKJ6B1VDuLPCXBeDDFzvrlSBIYCtN19M6dQGZRCvUE =

b8e020c7c10d564cfc3a9cc4d50b85ea3422422b73a2dd79930ead1fb601493279ba97645584d6dfa188e62f5eba5dc66d0dafdb7a82c08bf847bc84fc0718daSOVRrDlFmVMB / 12ok9kR68ekXJcJvw0yfo / cnU9ojtI =

每次尝试加密用户输入时,看到它们有所不同吗?这没有任何意义。

同样,如果我尝试解码数据库中的密码,使用相同的密钥加密,我什么也得不到,没有解密的密码。

那么,有谁知道这里发生了什么?

3 个答案:

答案 0 :(得分:4)

随机加密是实现语义安全性所必需的安全属性。如果加密不是随机的,则攻击者可能仅通过观察密文来检测先前是否发送了(前缀)消息。除了篇幅之外,你通常不希望攻击者知道关于明文的任何事情。

加密功能始终具有相应的解密功能。您似乎只使用这两种功能中的一种方式。您永远不应该加密用户的密码。您需要使用散列,而使用一些强大的散列是PBKDF2,bcrypt,scrypt和Argon2。由于散列函数是单向函数,因此您无法解密"解密"哈希。为了验证您的用户,您可以再次通过散列函数运行密码,以便与存储在数据库中的散列进行比较。查看更多:How to securely hash passwords?

答案 1 :(得分:1)

Codigniter文件:

  

请勿将此密码或任何其他加密库用于用户密码   存储!密码必须经过哈希处理,您应该通过   PHP自己的密码哈希扩展。

http://www.codeigniter.com/userguide3/libraries/encryption.html

在此完全解释:

http://php.net/manual/en/faq.passwords.php

答案 2 :(得分:-2)

尝试md5加密它的优点和最佳直到现在。 在控制器之前发送密码如下:

md5($this->input->post('password));

或使用hash()SHA256/SHA512他们做得很好。

它会起作用。

享受!