Pergunta

Possível duplicata:
Criptografia de 2 vias PHP: Preciso armazenar senhas que podem ser recuperadas

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

Base64 é descriptografado, então não faz sentido usar isso simplesmente. Minha idéia é embarcar no usuário e passar antes e depois que ele é baseado em 64, mesmo depois de descriptografá -lo, você recebe um texto engraçado se tentar descriptografar. Existe uma função PHP que aceita valores que façam uma disputa exclusiva de uma string e a retiram posteriormente quando o valor for reinúsculo?

Alguma sugestão?

Foi útil?

Solução

Você não deve criptografar senhas; em vez disso, você deve hast -lhes usando um algoritmo como o BCRYPT. Esta resposta explica como implementar corretamente o hash de senha no PHP. Ainda assim, aqui está como você criptografaria/descriptografaria:

$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ção. Você deve não confiar na criptografia não autenticada para segurança, especialmente porque o código conforme fornecido é vulnerável ao preenchimento de ataques do Oracle.

Veja também:

Além disso, não use apenas uma "senha" para uma chave de criptografia. As chaves de criptografia são cordas 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 "

Outras dicas

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

Encontrei 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";

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); 

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

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

Você provavelmente seria melhor usar um dos Extensões de criptografia Isso vem com PHP.

Isso só lhe dará proteção marginal. Se o invasor puder executar o código arbitrário em seu aplicativo, poderá obter as senhas exatamente da mesma maneira que seu aplicativo pode. Você ainda pode obter alguma proteção contra alguns ataques de injeção de SQL e backups de banco de dados extraviados se você armazenar uma chave secreta em um arquivo e usá -lo para criptografar a caminho do banco de dados e descriptografar na saída. Mas você deve usar o BindParams para evitar completamente a questão da injeção de SQL.

Se decidir criptografar, você deve usar alguma biblioteca de criptografia de alto nível para isso, ou você vai Entender errado. Você terá que obter as verificações de preenchimento de chave, preenchimento de mensagens e integridade corretas, ou todo o seu esforço de criptografia é de pouco uso. GPGME é uma boa escolha para um exemplo. McRypt é muito baixo e você provavelmente entenderá errado.

Securiy Aviso: Este código é inseguro. Além de ser vulnerável a ataques escolhidos por texto, sua dependência de unserialize() torna vulnerável à injeção de objeto PHP.

Para lidar com uma string / matriz, eu uso estas duas funções:

function encryptStringArray ($stringArray, $key = "Your secret salt thingie") {
 $s = strtr(base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($key), serialize($stringArray), MCRYPT_MODE_CBC, md5(md5($key)))), '+/=', '-_,');
 return $s;
}

function decryptStringArray ($stringArray, $key = "Your secret salt thingie") {
 $s = unserialize(rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, md5($key), base64_decode(strtr($stringArray, '-_,', '+/=')), MCRYPT_MODE_CBC, md5(md5($key))), "\0"));
 return $s;
}

É flexível, pois você pode armazenar/enviar via URL uma string ou matriz porque a string/matriz é serialzada antes da criptografia.

Confira myCrypt (): http://us.php.net/manual/en/book.mcrypt.php

E se você estiver usando o PostGres, houver pGCrypto para criptografia de nível de banco de dados. (facilita a pesquisa e a classificação)

A melhor idéia para criptografar/descriptografar seus dados no banco de dados, mesmo que você tenha acesso ao código é usar 2 passes diferentes em 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 fazer login no sistema. Este usuário passa é diferente para cada usuário.
  2. Cada entrada do usuário no banco de dados tem no md5 a system-pass Para a criptografia/descriptografia dos dados. Este passe de sistema é o mesmo para cada usuário.
  3. Sempre que um usuário está sendo removido do sistema, todos os dados criptografados sob o antigo passe do sistema precisam ser criptografados novamente sob um novo sistema de sistema para evitar problemas de segurança.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top