A extensão mcrypt está obsoleta e será removida no PHP 7.2 de acordo com o comentário postado aqui . Portanto, estou procurando uma maneira alternativa de criptografar senhas.
No momento estou usando algo como
mcrypt_encrypt(MCRYPT_RIJNDAEL_128, md5($key, true), $string, MCRYPT_MODE_CBC, $iv)
Preciso da sua opinião sobre a maneira melhor / mais forte de criptografar senhas, a senha criptografada deve, é claro, ser compatível com o PHP 7.xx e também deve ser descriptografável porque meus clientes querem ter a opção de 'recuperar' suas senhas sem gerar um novo 1.
password_hash
e verificá-los compassword_verify
?Respostas:
É uma prática recomendada fazer hash das senhas para que não sejam descriptografáveis. Isso torna as coisas um pouco mais difíceis para os invasores que podem ter obtido acesso ao seu banco de dados ou arquivos.
Se você precisar criptografar seus dados e torná-los descriptografáveis, um guia para criptografia / descriptografia segura está disponível em https://paragonie.com/white-paper/2015-secure-php-data-encryption . Para resumir esse link:
fonte
Sodium-compat
( github.com/paragonie/sodium_compat ) que funciona em PHP> = 5.2.4Conforme sugerido por @rqLizard , você pode usar funções
openssl_encrypt
/openssl_decrypt
PHP em vez disso, o que fornece uma alternativa muito melhor para implementar AES (The Advanced Encryption Standard) também conhecido como criptografia Rijndael.De acordo com o seguinte comentário de Scott em php.net :
Leitura adicional:
Exemplos de código
Exemplo 1
Exemplo # 2
Exemplo # 3
Com base nos exemplos acima, alterei o código a seguir, que visa criptografar a id de sessão do usuário:
para dentro:
Para esclarecer, a alteração acima não é uma conversão verdadeira, pois as duas criptografias usam um tamanho de bloco diferente e dados criptografados diferentes. Além disso, o preenchimento padrão é diferente,
MCRYPT_RIJNDAEL
suporta apenas preenchimento nulo não padrão. @zaphObservações adicionais (dos comentários de @zaph):
MCRYPT_RIJNDAEL_128
) é equivalente a AES , entretanto Rijndael 256 (MCRYPT_RIJNDAEL_256
) não é AES-256, pois 256 especifica um tamanho de bloco de 256 bits, enquanto AES tem apenas um tamanho de bloco: 128 bits. Então, basicamente, Rijndael com um tamanho de bloco de 256 bits (MCRYPT_RIJNDAEL_256
) foi nomeado por engano devido às escolhas dos desenvolvedores do mcrypt . @zaphA criptografia com tamanhos de bloco diferentes para Rijndael produz dados criptografados diferentes.
Por exemplo,
MCRYPT_RIJNDAEL_256
(não equivalente aAES-256
) define uma variante diferente da cifra de bloco Rijndael com tamanho de 256 bits e um tamanho de chave baseado na chave passada, ondeaes-256-cbc
é Rijndael com um tamanho de bloco de 128 bits com um tamanho de chave de 256 bits. Portanto, eles estão usando tamanhos de bloco diferentes que produzem dados criptografados totalmente diferentes, já que mcrypt usa o número para especificar o tamanho do bloco, onde o OpenSSL usa o número para especificar o tamanho da chave (AES só tem um tamanho de bloco de 128 bits). Então, basicamente, AES é Rijndael com um tamanho de bloco de 128 bits e tamanhos de chave de 128, 192 e 256 bits. Portanto, é melhor usar AES, que é chamado de Rijndael 128 no OpenSSL.fonte
$session_id = rtrim($decryptedSessionId, "\0");
? É possívelopenssl_decrypt
retornar alguns personagens indesejados no final? E se a variável criptografada terminar com 0 (ou sejaencrypt("abc0")
?"\0"
não é"0"
senão o caractere NULL, cujo código ASCII é 0x00 (hexadecimal 0).Implementação Pure-PHP de Rijndael existe com phpseclib disponível como pacote composer e funciona no PHP 7.3 (testado por mim).
Há uma página na documentação do phpseclib, que gera um código de amostra depois que você insere as variáveis básicas (cifra, modo, tamanho da chave, tamanho do bit). Ele produz o seguinte para Rijndael, ECB, 256, 256:
um código com mycrypt
funciona assim com a biblioteca
*
$term
erabase64_decoded
fonte
Conforme detalhado por outras respostas aqui, a melhor solução que encontrei é usar OpenSSL. Ele é integrado ao PHP e você não precisa de nenhuma biblioteca externa. Aqui estão alguns exemplos simples:
Para criptografar:
Para descriptografar:
Link de referência: https://www.shift8web.ca/2017/04/how-to-encrypt-and-execute-your-php-code-with-mcrypt/
fonte
Você pode usar o pacote phpseclib pollyfill. Você não pode usar open ssl ou libsodium para criptografar / descriptografar com rijndael 256. Outro problema, você não precisa substituir nenhum código.
fonte
mcrypt_compat
executando,composer require phpseclib/mcrypt_compat
mas continuoPHP Fatal error: Uncaught Error: Call to undefined function mcrypt_get_key_size() in /app/kohana/classes/Kohana/Encrypt.php:124
usando php7.2.26
e Kohana framwork. Há mais etapas a serem executadas após instalá-lo com o composer?require APPPATH . '/vendor/autoload.php';
ao final debootstrap.php
.Você deve usar o OpenSSL
mcrypt
conforme ele é desenvolvido e mantido ativamente. Ele fornece melhor segurança, facilidade de manutenção e portabilidade. Em segundo lugar, ele executa a criptografia / descriptografia AES muito mais rápido. Ele usa preenchimento PKCS7 por padrão, mas você pode especificarOPENSSL_ZERO_PADDING
se for necessário. Para usar com uma chave binária de 32 bytes, você pode especificar oaes-256-cbc
que é muito mais óbvio do queMCRYPT_RIJNDAEL_128
.Aqui está o exemplo de código usando Mcrypt:
E aqui está a versão escrita usando OpenSSL:
Fonte: Se você está digitando a palavra MCRYPT em seu código PHP, está fazendo errado .
fonte
Estou usando no PHP 7.2.x, está funcionando bem para mim:
e, em seguida, autenticar o hash com a seguinte função:
Exemplo:
e para autenticar este hash use o seguinte código:
Isso é tudo.
fonte
Conforme mencionado, você não deve armazenar as senhas de seus usuários em um formato que possa ser decifrado. A criptografia reversível fornece um caminho fácil para os hackers descobrirem as senhas dos seus usuários, o que se estende a colocar em risco as contas dos seus usuários em outros sites, caso eles usem a mesma senha lá.
O PHP fornece um par de funções poderosas para criptografia hash unilateral com sal aleatório -
password_hash()
epassword_verify()
. Como o hash é automaticamente salgado aleatoriamente, não há como os hackers utilizarem tabelas pré-compiladas de hashes de senha para fazer a engenharia reversa da senha. Defina aPASSWORD_DEFAULT
opção e as versões futuras do PHP usarão automaticamente algoritmos mais fortes para gerar hashes de senha sem que você precise atualizar seu código.fonte
Você deve usar a
openssl_encrypt()
função.fonte
Consegui traduzir meu objeto Crypto
Obtenha uma cópia do php com mcrypt para descriptografar os dados antigos. Eu fui para http://php.net/get/php-7.1.12.tar.gz/from/a/mirror , compilei, então adicionei a extensão ext / mcrypt (configure; make; make install). Acho que tive que adicionar a linha extenstion = mcrypt.so ao php.ini também. Uma série de scripts para construir versões intermediárias dos dados com todos os dados não criptografados.
Construa uma chave pública e privada para o openssl
Para criptografar (usando a chave pública), use openssl_seal. Pelo que li, o openssl_encrypt usando uma chave RSA é limitado a 11 bytes a menos que o comprimento da chave (veja o comentário http://php.net/manual/en/function.openssl-public-encrypt.php de Thomas Horsten)
Você provavelmente poderia armazenar o binário bruto.
Para descriptografar (usando chave privada)
PS Você não pode criptografar a string vazia ("")
PPS Isso é para um banco de dados de senha, não para validação do usuário.
fonte