reversible - simple php encrypt decrypt function




Melhor maneira de usar o PHP para criptografar e descriptografar senhas? (6)

Aviso de Segurança : Esta classe não é segura. Está usando o Rijndael256-ECB , que não é semanticamente seguro. Só porque "funciona" não significa "é seguro". Além disso, ele retira os espaços finais depois de não usar o preenchimento adequado.

Encontrou esta aula recentemente, funciona como um sonho!

class Encryption {
    var $skey = "yourSecretKey"; // you can change it

    public  function safe_b64encode($string) {
        $data = base64_encode($string);
        $data = str_replace(array('+','/','='),array('-','_',''),$data);
        return $data;
    }

    public function safe_b64decode($string) {
        $data = str_replace(array('-','_'),array('+','/'),$string);
        $mod4 = strlen($data) % 4;
        if ($mod4) {
            $data .= substr('====', $mod4);
        }
        return base64_decode($data);
    }

    public  function encode($value){ 
        if(!$value){return false;}
        $text = $value;
        $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
        $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
        $crypttext = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $this->skey, $text, MCRYPT_MODE_ECB, $iv);
        return trim($this->safe_b64encode($crypttext)); 
    }

    public function decode($value){
        if(!$value){return false;}
        $crypttext = $this->safe_b64decode($value); 
        $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
        $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
        $decrypttext = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $this->skey, $crypttext, MCRYPT_MODE_ECB, $iv);
        return trim($decrypttext);
    }
}

E para chamá-lo:

$str = "My secret String";

$converter = new Encryption;
$encoded = $converter->encode($str );
$decoded = $converter->decode($encoded);    

echo "$encoded<p>$decoded";

Duplicata Possível:
Criptografia do PHP 2-way: Eu preciso armazenar senhas que podem ser recuperadas

Eu pretendo armazenar informações de conta estrangeira para os meus usuários no meu site, também conhecido como nome de usuário e senhas rapidshare, etc ... Eu quero manter as informações seguras, mas eu sei que se eu hash suas informações, não posso recuperá-las para uso posterior .

Base64 é descriptografar, então não adianta usar isso simplesmente. Minha idéia é embaralhar o usuário e passar antes e depois de ficar assim mesmo depois de descriptografá-lo, você terá um texto com aparência engraçada se tentar decifrar. Existe uma função php que aceita valores que farão uma mistura única de uma string e a removerá mais tarde quando o valor for reintroduzido?

Alguma sugestão?


Aviso de segurança: este código não é seguro.

exemplo de trabalho

define('SALT', 'whateveryouwant'); 

function encrypt($text) 
{ 
    return trim(base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, SALT, $text, MCRYPT_MODE_ECB, mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND)))); 
} 

function decrypt($text) 
{ 
    return trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, SALT, base64_decode($text), MCRYPT_MODE_ECB, mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND))); 
} 

$encryptedmessage = encrypt("your message"); 
echo decrypt($encryptedmessage); 

A melhor idéia para criptografar / descriptografar seus dados no banco de dados, mesmo se você tiver acesso ao código, é usar 2 passagens diferentes, uma senha privada ( user-pass ) para cada usuário e um código privado para todos os usuários ( system-pass ).

Cenário

  1. user-pass é armazenado com md5 no banco de dados e está sendo usado para validar cada usuário para efetuar login no sistema. Este passe de usuário é diferente para cada usuário.
  2. Cada entrada de usuário no banco de dados tem em md5 uma system-pass para a criptografia / descriptografia dos dados. Essa passagem do sistema é a mesma para cada usuário.
  3. Sempre que um usuário estiver sendo removido do sistema, todos os dados criptografados sob a passagem do sistema antigo precisam ser criptografados novamente em uma nova passagem de sistema para evitar problemas de segurança.


Uma coisa que você deve estar ciente ao lidar com criptografia:

Tentar ser inteligente e inventar suas próprias coisas geralmente deixará você com algo inseguro.

Você provavelmente seria melhor usar uma das extensões de criptografia que vêm com o PHP.


Você não deve criptografar senhas, em vez disso, você deve usá-las usando um algoritmo como o bcrypt. Esta resposta explica como implementar corretamente o hashing de senhas no PHP . Ainda assim, aqui está como você iria criptografar / descriptografar:

$key = 'password to (en/de)crypt';
$string = ' string to be encrypted '; // note the spaces

Para criptografar:

$iv = mcrypt_create_iv(
    mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC),
    MCRYPT_DEV_URANDOM
);

$encrypted = base64_encode(
    $iv .
    mcrypt_encrypt(
        MCRYPT_RIJNDAEL_128,
        hash('sha256', $key, true),
        $string,
        MCRYPT_MODE_CBC,
        $iv
    )
);

Para descriptografar:

$data = base64_decode($encrypted);
$iv = substr($data, 0, mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC));

$decrypted = rtrim(
    mcrypt_decrypt(
        MCRYPT_RIJNDAEL_128,
        hash('sha256', $key, true),
        substr($data, mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC)),
        MCRYPT_MODE_CBC,
        $iv
    ),
    "\0"
);

Aviso : O exemplo acima criptografa informações, mas não autentica o texto cifrado para evitar adulterações. Você não deve confiar na criptografia não autenticada para segurança , especialmente porque o código fornecido é vulnerável a ataques oracle.

Veja também:

  • https://.com/a/30189841/2224584
  • https://.com/a/30166085/2224584
  • https://.com/a/30159120/2224584

Além disso, não use apenas uma "senha" para uma chave de criptografia. Chaves de criptografia são strings aleatórias.

Demonstração em 3v4l.org :

echo 'Encrypted:' . "\n";
var_dump($encrypted); // "m1DSXVlAKJnLm7k3WrVd51omGL/05JJrPluBonO9W+9ohkNuw8rWdJW6NeLNc688="

echo "\n";

echo 'Decrypted:' . "\n";
var_dump($decrypted); // " string to be encrypted "




scramble