Parolaları şifrelemek ve şifresini çözmek için PHP kullanmak için en iyi yolu?

8 Cevap php

Possible Duplicate:
PHP 2-way encryption: I need to store passwords that can be retrieved

Ben güvenli bilgi tutmak istiyorum .. rapidshare kullanıcı adı ve şifreleri, vb aka, web sitemde kullanıcılar için dış hesap bilgilerini saklamak için plan, ama ben onların bilgilerini karma eğer, ben daha sonra kullanmak için almak değil biliyorum .

Base64 is decrypt-able so there's no point using that just plain off. My idea is to scramble the user and pass before and after it gets base64ed that way even after you decrypt it, you get some funny looking text if you try to decrypt. Is there a php function that accepts values that will make an unique scramble of a string and de-scramble it later when the value is reinputed?

Herhangi bir öneriniz?

8 Cevap

You should not encrypt passwords, instead you should hash them using an algorithm like bcrypt. Yine de, burada / şifresini şifrelemek nasıl olduğunu:

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

To Encrypt:

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

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

To Decrypt:

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

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

Demo at IDEOne.com:

echo 'Encrypted:' . "\n";
var_dump($encrypted); // "ey7zu5zBqJB0rGtIn5UB1xG03efyCp+KSNR4/GAv14w="

echo "\n";

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

Son zamanlarda bu sınıf buldum, bir rüya gibi çalışıyor!

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

Ve onu aramak için:

$str = "My secret String";

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

echo "$encoded<p>$decoded";

çalışma örneği

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

Eğer şifreleme ile uğraşırken çok farkında olması gereken bir şey:

Zeki olmak için çalışmak ve genellikle kendi şey icat güvensiz bir şey ile yalnız bırakacaktır.

Muhtemelen PHP ile gelen cryptography extensions birini kullanarak kapalı iyi olurdu.

: Ben bu iki işlevi kullanmak bir dize / dizi işlemek için

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

Bu dize / Dizi şifreleme önce serialzed çünkü URL bir dize veya dizi yoluyla göndermek / saklayabilirsiniz gibi esnek.

Mycrypt Çıkış (): http://us.php.net/manual/en/book.mcrypt.php

Eğer postgres kullanıyorsanız ve veritabanı seviyesinde şifreleme için pgcrypto var. (Kolay arama ve sıralamak için yapar)

Bu size sadece marjinal koruma verecek. Saldırgan uygulama rasgele kod çalıştırabilir eğer uygulama olabilir aynı şekilde şifreleri de alabilirsiniz. Bir dosyada bir gizli anahtarı depolamak ve db yolda şifrelemek ve dışarı yolda şifresini kullanan eğer hala bazı SQL enjeksiyon saldırıları ve yanlış db yedekleri bazı koruma alabilir. Ama tamamen SQL enjeksiyon sorunu önlemek için bindparams kullanmalısınız.

Şifrelemek için karar verirseniz, bu bazı yüksek seviye kripto kütüphanesi kullanmanız gerekir, ya da will yanlış olsun. Sen anahtar kurulum, mesaj dolgu ve bütünlük kontrolleri doğru almak gerekecek, ya da şifreleme çaba her bir kullanımı vardır. GPGME, bir örnek için iyi bir seçimdir. Mcrypt çok düşük düzeyde olduğunu ve muhtemelen yanlış olacaktır.

Eğer koduna erişiminiz olsa bile veritabanındaki verileri şifrelemek için / şifresini iyi fikir 2 farklı {(tüm kullanıcılar için her kullanıcı ve özel bir kodu (user-pass) özel bir parola geçer kullanmaktır [(1)]}).

Scenario

  1. user-pass veritabanında MD5 ile saklanır ve sisteme giriş için her kullanıcıyı doğrulamak için kullanılan ediliyor. Bu kullanıcı geçiren different, her kullanıcı için.
  2. Veritabanında her kullanıcı girdi veri şifreleme / şifre çözme için bir MD5 system-pass vardır. Bu sistem-pass her kullanıcı için same olduğunu.
  3. Her zaman bir kullanıcı eski sistem-pass altında şifreli tüm veri güvenliği sorunlarını önlemek için yeni bir sistem-pass altında yeniden şifreli olması sistemden kaldırılır ediliyor.