CodeIgniter – Por que a criptografia com a mesma chave produz resultados diferentes?

Eu uso o codeigniter muito, no entanto, não estou realmente entendendo porque, quando eu uso a biblioteca de criptografia na versão 3, a cadeia de criptografia nunca sai da mesma forma, mesmo usando o mesmo sal / chave.

Então, armazenei uma senha de usuário como uma seqüência de caracteres criptografada, que usa sua própria chave para criptografar. A chave é armazenada no database. Mas quando eles vêm para o login, e eu quero criptografar a senha inserida para verificar a correspondência de strings, eles nunca combinam!

Parece que a biblioteca sempre cuspa diferentes cordas criptografadas, não importa se a chave é igual ou não, como isso vai ser útil se eu não conseguir corresponder a senha criptografada armazenada à senha que entram no login?

Por exemplo, a senha é 12456 com a chave a0956f251b9d957071005a2d11e4630a

SENHA SALVADA É: 0e6effa48949d6bf19e84530bc86e9a1407086b3b88fc368b6f8b7b53304b313eeebdb695c9cca10b3e7072f608bf4137e7fcc7d24fed54df2b6dcba3f94dcb6Tm05Qmay9G8JuUXps6UstWebmBmJ71BcIPgrW78OvSY =

SENHA GERADA A PARTIR DA LOGIN DO USUÁRIO

6b893dac92155bc663b126b805c7189214ac4667b226f0c6fc22cf0c6bcca5e897c49961e8852ade1c3e85cbecab89df76ea7891727af6bf0bcc232b75d0d441LLUMZgOy4zLwAypuVQuK0lKTXrlXYptKpVdByytH2D8 =

935c8f564c4a5ecb53510faa835eca8622069c34d534df6b9c2ea52de2d9bea5976128f6ff83a572ac677be4ebd690bc18e488518c2eed8b1b40a16c9e61d6b2hbKJ6B1VDuLPCXBeDDFzvrlSBIYCtN19M6dQGZRCvUE =

b8e020c7c10d564cfc3a9cc4d50b85ea3422422b73a2dd79930ead1fb601493279ba97645584d6dfa188e62f5eba5dc66d0dafdb7a82c08bf847bc84fc0718daSOVRrDlFmVMB / 12ok9kR68ekXJcJvw0yfo / cnU9ojtI =

Veja que eles são diferentes sempre que eu tento criptografar a input do usuário? Não faz sentido.

Da mesma forma, se eu tentar decodificar a senha no database, com a mesma chave que foi criptografada, não recebo nada de volta, sem senha descifrada.

Então, alguém sabe o que está acontecendo aqui?

A criptografia aleatória é uma propriedade de segurança necessária para alcançar a segurança semântica. Se a encriptação não fosse aleatorizada, um invasor poderá detectar se as mensagens (prefixos) foram enviadas anteriormente apenas observando os textos cifrados. Em geral, você não quer que o atacante saiba nada sobre os textos simples, exceto o comprimento.

Uma function de criptografia sempre possui uma function de descriptografia correspondente. Parece que você está usando somente uma maneira das duas funções. Você nunca deve criptografar as senhas do usuário. Você precisa usar hashing em vez disso, com alguns fortes sendo PBKDF2 , bcrypt, scrypt e Argon2. Uma vez que as funções de hash são function unidirecional, você não poderá “descriptografar” os hashes. Para autenticar seu usuário, você pode executar a senha através da function hash novamente para comparar com o hash que está armazenado no database. Veja mais: Como contratar com segurança as senhas?

Documentação Codigniter:

NÃO use esta ou qualquer outra biblioteca de criptografia para armazenamento de senha do usuário! As senhas devem ser substituídas em vez disso, e você deve fazer isso através da própria extensão Hashing de senha do PHP.

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

Totalmente explicado aqui:

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

Experimente a criptografia md5 é bom e melhor até agora. No controlador antes de enviar uma senha como esta:

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

ou use hash() ou SHA256/SHA512 eles fazem isso bem.

Isso fará o truque.

Apreciar!