mcrypt kullanımdan kaldırıldı, alternatif nedir?


103

Mcrypt uzantısı kullanımdan kaldırıldı, burada yayınlanan yoruma göre PHP 7.2'de kaldırılacaktır . Bu yüzden şifreleri şifrelemek için alternatif bir yol arıyorum.

Şu anda şöyle bir şey kullanıyorum

mcrypt_encrypt(MCRYPT_RIJNDAEL_128, md5($key, true), $string, MCRYPT_MODE_CBC, $iv)

Şifreleri şifrelemenin en iyi / en güçlü yolu için fikrinize ihtiyacım var, şifrelenmiş şifre elbette PHP 7.xx tarafından desteklenmeli ve ayrıca şifresi çözülebilir olmalıdır çünkü müşterilerim yeni bir şifre oluşturmadan şifrelerini 'kurtarma' seçeneğine sahip olmak istiyor. bir.


9
Neden şifreleri şifrelemeniz / şifrelerini çözmeniz gerekiyor? Neden onları hash edip password_hashdoğrulamıyorsunuz password_verify?
Panik Yapmayın

3
"şifrelenmiş parola da deşifre edilebilir olmalıdır" - neden? çok güvenli gelmiyor. Özel bir nedeni var mı?
Funk Forty Niner

24
"çünkü müşterilerim yeni bir şifre oluşturmadan şifrelerini 'kurtarma' seçeneğine sahip olmak istiyor." - Bu güvenli değildir ve bunun yerine şifrelerini sıfırlama seçeneği sunulmalıdır.
Funk Forty Niner

4
Şifreleri şifrelemeyin , saldırgan DB'yi aldığında şifreleme anahtarını da alacaktır. Yaklaşık 100 ms süreyle rastgele bir tuzla bir HMAC üzerinde yineleyin ve karma ile tuzu kaydedin. Password_hash, PBKDF2, Bcrypt ve benzer işlevler gibi işlevleri kullanın. Amaç, saldırganın kaba kuvvet kullanarak şifre bulmak için çok zaman harcamasını sağlamaktır.
zaph

2
Php kılavuzundan -> Bu işlev PHP 7.1.0'dan itibaren KULLANIMDAN KALDIRILMIŞTIR. Bu işleve güvenmek kesinlikle önerilmez. > - Alternatif sodyum php.net/manual/en/book.sodium.php
MarcoZen

Yanıtlar:


47

Şifrelerin şifresinin çözülememesi için en iyi yöntem şifreleri karıştırmaktır. Bu, veritabanınıza veya dosyalarınıza erişmiş olabilecek saldırganlar için işleri biraz daha zor hale getirir.

Verilerinizi şifrelemeniz ve şifresini çözebilmeniz gerekiyorsa, şifreleme / şifre çözmeyi güvenli hale getirmek için bir kılavuz https://paragonie.com/white-paper/2015-secure-php-data-encryption adresinde mevcuttur . Bu bağlantıyı özetlemek için:

  • Libsodium Kullan - Bir PHP uzantısı
  • Libsodium kullanamıyorsanız, defuse / php-encryption kullanın - Düz PHP kodu
  • Libsodium'u kullanamıyorsanız veya / php şifrelemeyi etkisiz hale getiremiyorsanız, OpenSSL kullanın - Bir çok sunucuda zaten bu yüklü olacaktır. Değilse, --with-openssl [= DIR] ile derlenebilir

1
İlk önce openssl'yi denemelisiniz çünkü libsodyumun olmadığı yerde çok yaygındır. Tüm yerel uzantılar sorgulanmadıkça ham php kullanılmamalıdır
JSON

openssl çok yaygın olmasına rağmen, php 7'nin çekirdek şifreleme güvenliği
shadi

1
PHP> = 5.2.4'te çalışan Sodium-compat( github.com/paragonie/sodium_compat ) adında bir kitaplık olduğunu unutmayın
RaelB

30

@RqLizard tarafından önerildiği gibi , bunun yerine Rijndael şifrelemesi olarak da bilinen AES (Gelişmiş Şifreleme Standardı) uygulamak için çok daha iyi bir alternatif sağlayan openssl_encrypt/ openssl_decryptPHP işlevlerini kullanabilirsiniz .

Aşağıdaki Scott'ın php.net'teki yorumuna göre :

2015'te verileri şifrelemek / şifrelemek için kod yazıyorsanız, openssl_encrypt()ve kullanmalısınız openssl_decrypt(). Temel kitaplık ( libmcrypt) 2007'den beri terk edilmiş ve OpenSSL'den ( AES-NImodern işlemcilerden yararlanan ve önbellek zamanlaması güvenli) çok daha kötü performans gösteriyor .

Ayrıca, MCRYPT_RIJNDAEL_256değil AES-256, bu Rijndael blok şifresinin farklı bir çeşidi. İsterseniz AES-256de mcrypt, kullanmak zorunda MCRYPT_RIJNDAEL_12832 bayt anahtar ile. OpenSSL, hangi modu kullandığınızı (yani aes-128-cbcvs aes-256-ctr) daha belirgin hale getirir .

OpenSSL ayrıca mcrypt'in NULL bayt dolgusu yerine CBC modunda PKCS7 dolgusunu kullanır. Bu nedenle, mcrypt, kodunuzu OpenSSL'den daha fazla oracle saldırılarına karşı savunmasız hale getirir.

Son olarak, şifreli metinlerinizi doğrulamıyorsanız (Sonra Şifrele MAC), yanlış yapıyorsunuz demektir.

Daha fazla okuma:

Kod örnekleri

Örnek 1

PHP 7.1+ için GCM modunda AES Kimlik Doğrulamalı Şifreleme örneği

<?php
//$key should have been previously generated in a cryptographically safe way, like openssl_random_pseudo_bytes
$plaintext = "message to be encrypted";
$cipher = "aes-128-gcm";
if (in_array($cipher, openssl_get_cipher_methods()))
{
    $ivlen = openssl_cipher_iv_length($cipher);
    $iv = openssl_random_pseudo_bytes($ivlen);
    $ciphertext = openssl_encrypt($plaintext, $cipher, $key, $options=0, $iv, $tag);
    //store $cipher, $iv, and $tag for decryption later
    $original_plaintext = openssl_decrypt($ciphertext, $cipher, $key, $options=0, $iv, $tag);
    echo $original_plaintext."\n";
}
?>

Örnek 2

PHP 5.6+ için AES Authenticated Encryption örneği

<?php
//$key previously generated safely, ie: openssl_random_pseudo_bytes
$plaintext = "message to be encrypted";
$ivlen = openssl_cipher_iv_length($cipher="AES-128-CBC");
$iv = openssl_random_pseudo_bytes($ivlen);
$ciphertext_raw = openssl_encrypt($plaintext, $cipher, $key, $options=OPENSSL_RAW_DATA, $iv);
$hmac = hash_hmac('sha256', $ciphertext_raw, $key, $as_binary=true);
$ciphertext = base64_encode( $iv.$hmac.$ciphertext_raw );

//decrypt later....
$c = base64_decode($ciphertext);
$ivlen = openssl_cipher_iv_length($cipher="AES-128-CBC");
$iv = substr($c, 0, $ivlen);
$hmac = substr($c, $ivlen, $sha2len=32);
$ciphertext_raw = substr($c, $ivlen+$sha2len);
$original_plaintext = openssl_decrypt($ciphertext_raw, $cipher, $key, $options=OPENSSL_RAW_DATA, $iv);
$calcmac = hash_hmac('sha256', $ciphertext_raw, $key, $as_binary=true);
if (hash_equals($hmac, $calcmac))//PHP 5.6+ timing attack safe comparison
{
    echo $original_plaintext."\n";
}
?>

Örnek 3

Yukarıdaki örneklere dayanarak, kullanıcının oturum kimliğini şifrelemeyi amaçlayan aşağıdaki kodu değiştirdim:

class Session {

  /**
   * Encrypts the session ID and returns it as a base 64 encoded string.
   *
   * @param $session_id
   * @return string
   */
  public function encrypt($session_id) {
    // Get the MD5 hash salt as a key.
    $key = $this->_getSalt();
    // For an easy iv, MD5 the salt again.
    $iv = $this->_getIv();
    // Encrypt the session ID.
    $encrypt = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $session_id, MCRYPT_MODE_CBC, $iv);
    // Base 64 encode the encrypted session ID.
    $encryptedSessionId = base64_encode($encrypt);
    // Return it.
    return $encryptedSessionId;
  }

  /**
   * Decrypts a base 64 encoded encrypted session ID back to its original form.
   *
   * @param $encryptedSessionId
   * @return string
   */
  public function decrypt($encryptedSessionId) {
    // Get the MD5 hash salt as a key.
    $key = $this->_getSalt();
    // For an easy iv, MD5 the salt again.
    $iv = $this->_getIv();
    // Decode the encrypted session ID from base 64.
    $decoded = base64_decode($encryptedSessionId);
    // Decrypt the string.
    $decryptedSessionId = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $decoded, MCRYPT_MODE_CBC, $iv);
    // Trim the whitespace from the end.
    $session_id = rtrim($decryptedSessionId, "\0");
    // Return it.
    return $session_id;
  }

  public function _getIv() {
    return md5($this->_getSalt());
  }

  public function _getSalt() {
    return md5($this->drupal->drupalGetHashSalt());
  }

}

içine:

class Session {

  const SESS_CIPHER = 'aes-128-cbc';

  /**
   * Encrypts the session ID and returns it as a base 64 encoded string.
   *
   * @param $session_id
   * @return string
   */
  public function encrypt($session_id) {
    // Get the MD5 hash salt as a key.
    $key = $this->_getSalt();
    // For an easy iv, MD5 the salt again.
    $iv = $this->_getIv();
    // Encrypt the session ID.
    $ciphertext = openssl_encrypt($session_id, self::SESS_CIPHER, $key, $options=OPENSSL_RAW_DATA, $iv);
    // Base 64 encode the encrypted session ID.
    $encryptedSessionId = base64_encode($ciphertext);
    // Return it.
    return $encryptedSessionId;
  }

  /**
   * Decrypts a base 64 encoded encrypted session ID back to its original form.
   *
   * @param $encryptedSessionId
   * @return string
   */
  public function decrypt($encryptedSessionId) {
    // Get the Drupal hash salt as a key.
    $key = $this->_getSalt();
    // Get the iv.
    $iv = $this->_getIv();
    // Decode the encrypted session ID from base 64.
    $decoded = base64_decode($encryptedSessionId, TRUE);
    // Decrypt the string.
    $decryptedSessionId = openssl_decrypt($decoded, self::SESS_CIPHER, $key, $options=OPENSSL_RAW_DATA, $iv);
    // Trim the whitespace from the end.
    $session_id = rtrim($decryptedSessionId, '\0');
    // Return it.
    return $session_id;
  }

  public function _getIv() {
    $ivlen = openssl_cipher_iv_length(self::SESS_CIPHER);
    return substr(md5($this->_getSalt()), 0, $ivlen);
  }

  public function _getSalt() {
    return $this->drupal->drupalGetHashSalt();
  }

}

Açıklığa kavuşturmak gerekirse, iki şifreleme farklı bir blok boyutu ve farklı bir şifrelenmiş veri kullandığından yukarıdaki değişiklik gerçek bir dönüşüm değildir. Ek olarak, varsayılan dolgu farklıdır, MCRYPT_RIJNDAELyalnızca standart olmayan boş doldurmayı destekler. @zaph


Ek notlar (@ zaph'ın yorumlarından):

  • Rijndael 128 ( MCRYPT_RIJNDAEL_128) , AES'e eşdeğerdir , ancak Rijndael 256 ( MCRYPT_RIJNDAEL_256) , 256 bitlik bir blok boyutunu belirlediğinden AES-256 değildir , oysa AES yalnızca bir blok boyutuna sahiptir: 128 bit. Yani temelde 256 bitlik ( MCRYPT_RIJNDAEL_256) blok boyutuna sahip Rijndael , mcrypt geliştiricilerinin seçimleri nedeniyle yanlışlıkla adlandırılmıştır . @zaph
  • 256 blok boyutuna sahip Rijndael, 128 bitlik bir blok boyutuna göre daha az güvenli olabilir, çünkü ikincisi çok daha fazla inceleme ve kullanıma sahipti. İkinci olarak, birlikte çalışabilirlik, AES genel olarak mevcutken, 256 bitlik bir blok boyutuna sahip Rijndael'in olmadığı durumda engellenir.
  • Rijndael için farklı blok boyutlarıyla şifreleme, farklı şifrelenmiş veriler üretir.

    Örneğin, MCRYPT_RIJNDAEL_256(eşdeğer olmayan AES-256) 256 bit boyutuna ve anahtar geçirilen göre bir anahtar boyutu Rijndael blok şifreleme farklı bir çeşidini tanımlar, burada aes-256-cbcRijndael bir anahtar boyutu 128-bitlik bir blok boyutuna sahip olan 256 bit. Bu nedenle, mcrypt, blok boyutunu belirtmek için sayıyı kullandığından, tamamen farklı şifrelenmiş veriler üreten farklı blok boyutları kullanıyorlar; burada OpenSSL, anahtar boyutunu belirtmek için sayıyı kullandı (AES yalnızca 128 bitlik bir blok boyutuna sahiptir). Yani temelde AES, 128 bitlik blok boyutuna ve 128, 192 ve 256 bitlik anahtar boyutlarına sahip Rijndael'dir. Bu nedenle OpenSSL'de Rijndael 128 olarak adlandırılan AES kullanmak daha iyidir.


1
Genel olarak 256 bitlik bir blok boyutunda Rijndael kullanmak, mcrypt geliştiricilerinin seçimleri nedeniyle bir hatadır. Ayrıca 256 blok boyutuna sahip Rijndael, 128 bitlik blok boyutuna göre daha az güvenli olabilir, çünkü ikincisi çok daha fazla inceleme ve kullanıma sahipti. Ek olarak birlikte çalışabilirlik, AES genel olarak mevcutken, 256 bitlik bir blok boyutuna sahip Rijndael'in mevcut olmaması nedeniyle engellenmektedir.
zaph

Bunu neden $session_id = rtrim($decryptedSessionId, "\0");? openssl_decryptSonunda bazı istenmeyen karakterleri döndürmek mümkün mü ? Ya şifrelenmiş değişken 0 ile biterse (yani encrypt("abc0")?
hlscalon

@hiscalon "\0", "0"ASCII kodu 0x00 (onaltılık 0) olan NULL karakterden başka bir şey değildir .
kiamlaluno

11

Rijndael'in saf-PHP uygulaması phpseclib'de mevcuttur besteci paketi olarak mevcuttur ve PHP 7.3 üzerinde çalışır (benim tarafımdan test edilmiştir).

Phpseclib belgelerinde örnek kod üreten bir sayfa var temel değişkenleri (şifre, mod, anahtar boyutu, bit boyutu) girdikten sonra . Rijndael, ECB, 256, 256 için aşağıdaki çıktıları verir:

mycrypt ile bir kod

$decoded = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, ENCRYPT_KEY, $term, MCRYPT_MODE_ECB);

kütüphane ile böyle çalışır

$rijndael = new \phpseclib\Crypt\Rijndael(\phpseclib\Crypt\Rijndael::MODE_ECB);
$rijndael->setKey(ENCRYPT_KEY);
$rijndael->setKeyLength(256);
$rijndael->disablePadding();
$rijndael->setBlockLength(256);

$decoded = $rijndael->decrypt($term);

* $termoldubase64_decoded


11

Buradaki diğer yanıtlarda ayrıntılı olarak açıklandığı gibi, bulduğum en iyi çözüm OpenSSL kullanmaktır. PHP'de yerleşiktir ve herhangi bir harici kitaplığa ihtiyacınız yoktur. İşte basit örnekler:

Şifrelemek için:

function encrypt($key, $payload) {
  $iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length('aes-256-cbc'));
  $encrypted = openssl_encrypt($payload, 'aes-256-cbc', $key, 0, $iv);
  return base64_encode($encrypted . '::' . $iv);
}

Şifresini çözmek için:

function decrypt($key, $garble) {
    list($encrypted_data, $iv) = explode('::', base64_decode($garble), 2);
    return openssl_decrypt($encrypted_data, 'aes-256-cbc', $key, 0, $iv);
}

Referans bağlantısı: https://www.shift8web.ca/2017/04/how-to-encrypt-and-execute-your-php-code-with-mcrypt/


Arkadaşın için çok iyi karma! Tek bir şey var: Örneğin şifre eski kodla şifrelenmişse, yeni şifre çözme kodu onu doğrulayamayacaktır. Bu yeni kodla yeniden kaydedilmeli ve şifrelenmelidir.
Lumis

Basit bir geçiş betiği bu sorunu çözecektir. Şifresini çözmek için eski yöntemi, ardından şifreleme ve depolamanın yeni yolunu kullanın. Alternatif, kullanıcı tablosuna bir bayrak eklemek ve parola değişikliği gerektiren tüm kullanıcı hesaplarında zorunlu parola sıfırlama komut dosyası oluşturmaktır.
cecil merrel aka getrainfire

8

Phpseclib pollyfill paketini kullanabilirsiniz . Rijndael 256 ile şifreleme / şifre çözme için open ssl veya libsodium kullanamazsınız. Diğer bir sorun, herhangi bir kodu değiştirmenize gerek yoktur.


2
Bu çok yardımcı oldu, teşekkürler. Php-mcrypt uzantısını kaldırmamız gerekiyordu ve sonra bu bir cazibe gibi çalışıyor.
DannyB

Ben yüklü mcrypt_compatçalıştırarak composer require phpseclib/mcrypt_compatama hala olsun PHP Fatal error: Uncaught Error: Call to undefined function mcrypt_get_key_size() in /app/kohana/classes/Kohana/Encrypt.php:124php kullanıyorum 7.2.26ve Kohana çerçevesini. Composer ile kurduktan sonra gerçekleştirilecek başka adımlar var mı?
M-Dahab

Anladım. En require APPPATH . '/vendor/autoload.php';altına eklemelisiniz bootstrap.php.
M-Dahab

3

mcryptAktif olarak geliştirildiği ve sürdürüldüğü için OpenSSL'yi kullanmalısınız . Daha iyi güvenlik, bakım kolaylığı ve taşınabilirlik sağlar. İkinci olarak, AES şifreleme / şifre çözme işlemini çok daha hızlı gerçekleştirir. Varsayılan olarak PKCS7 dolgusunu kullanır, ancak OPENSSL_ZERO_PADDINGihtiyacınız olup olmadığını belirtebilirsiniz . 32 baytlık ikili anahtarla kullanmak için aes-256-cbchangisinin daha açık olduğunu belirtebilirsiniz.MCRYPT_RIJNDAEL_128 .

Mcrypt kullanan kod örneği:

PKCS7 dolgulu Mcrypt'te yazılmış, kimliği doğrulanmamış AES-256-CBC şifreleme kitaplığı.

/**
 * This library is unsafe because it does not MAC after encrypting
 */
class UnsafeMcryptAES
{
    const CIPHER = MCRYPT_RIJNDAEL_128;

    public static function encrypt($message, $key)
    {
        if (mb_strlen($key, '8bit') !== 32) {
            throw new Exception("Needs a 256-bit key!");
        }
        $ivsize = mcrypt_get_iv_size(self::CIPHER);
        $iv = mcrypt_create_iv($ivsize, MCRYPT_DEV_URANDOM);

        // Add PKCS7 Padding
        $block = mcrypt_get_block_size(self::CIPHER);
        $pad = $block - (mb_strlen($message, '8bit') % $block, '8bit');
        $message .= str_repeat(chr($pad), $pad);

        $ciphertext = mcrypt_encrypt(
            MCRYPT_RIJNDAEL_128,
            $key,
            $message,
            MCRYPT_MODE_CBC,
            $iv
        );

        return $iv . $ciphertext;
    }

    public static function decrypt($message, $key)
    {
        if (mb_strlen($key, '8bit') !== 32) {
            throw new Exception("Needs a 256-bit key!");
        }
        $ivsize = mcrypt_get_iv_size(self::CIPHER);
        $iv = mb_substr($message, 0, $ivsize, '8bit');
        $ciphertext = mb_substr($message, $ivsize, null, '8bit');

        $plaintext = mcrypt_decrypt(
            MCRYPT_RIJNDAEL_128,
            $key,
            $ciphertext,
            MCRYPT_MODE_CBC,
            $iv
        );

        $len = mb_strlen($plaintext, '8bit');
        $pad = ord($plaintext[$len - 1]);
        if ($pad <= 0 || $pad > $block) {
            // Padding error!
            return false;
        }
        return mb_substr($plaintext, 0, $len - $pad, '8bit');
    }
}

Ve işte OpenSSL kullanılarak yazılan sürüm:

/**
 * This library is unsafe because it does not MAC after encrypting
 */
class UnsafeOpensslAES
{
    const METHOD = 'aes-256-cbc';

    public static function encrypt($message, $key)
    {
        if (mb_strlen($key, '8bit') !== 32) {
            throw new Exception("Needs a 256-bit key!");
        }
        $ivsize = openssl_cipher_iv_length(self::METHOD);
        $iv = openssl_random_pseudo_bytes($ivsize);

        $ciphertext = openssl_encrypt(
            $message,
            self::METHOD,
            $key,
            OPENSSL_RAW_DATA,
            $iv
        );

        return $iv . $ciphertext;
    }

    public static function decrypt($message, $key)
    {
        if (mb_strlen($key, '8bit') !== 32) {
            throw new Exception("Needs a 256-bit key!");
        }
        $ivsize = openssl_cipher_iv_length(self::METHOD);
        $iv = mb_substr($message, 0, $ivsize, '8bit');
        $ciphertext = mb_substr($message, $ivsize, null, '8bit');

        return openssl_decrypt(
            $ciphertext,
            self::METHOD,
            $key,
            OPENSSL_RAW_DATA,
            $iv
        );
    }
}

Kaynak: PHP Kodunuza MCRYPT Kelime Yazıyorsanız, Yanlış Yapıyorsunuz demektir .


2

Bunu PHP 7.2.x üzerinde kullanıyorum, benim için iyi çalışıyor:

public function make_hash($userStr){
        try{
            /** 
             * Used and tested on PHP 7.2x, Salt has been removed manually, it is now added by PHP 
             */
             return password_hash($userStr, PASSWORD_BCRYPT);
            }catch(Exception $exc){
                $this->tempVar = $exc->getMessage();
                return false;
            }
        }

ve ardından hash'i aşağıdaki işlevle doğrulayın:

public function varify_user($userStr,$hash){
        try{
            if (password_verify($userStr, $hash)) {
                 return true;
                }
            else {
                return false;
                }
            }catch(Exception $exc){
                $this->tempVar = $exc->getMessage();
                return false;
            }
        }

Misal:

  //create hash from user string

 $user_password = $obj->make_hash2($user_key);

ve bu karmanın kimliğini doğrulamak için aşağıdaki kodu kullanın:

if($obj->varify_user($key, $user_key)){
      //this is correct, you can proceed with  
    }

Bu kadar.


1

Belirtildiği gibi, kullanıcılarınızın şifrelerini şifresi çözülebilir bir formatta saklamamalısınız. Tersine çevrilebilir şifreleme, bilgisayar korsanlarının kullanıcılarınızın şifrelerini bulması için kolay bir yol sağlar; bu, kullanıcılarınızın hesaplarını başka sitelerde aynı şifreyi kullanmaları durumunda riske atmaya kadar uzanır.

PHP, rastgele tuzlanmış, tek yönlü karma şifreleme için bir çift güçlü işlev sağlar - password_hash()ve password_verify(). Karma otomatik olarak rastgele tuzlandığından, bilgisayar korsanlarının parolayı tersine çevirmek için önceden derlenmiş parola karmaları tablolarını kullanması mümkün değildir. Bu PASSWORD_DEFAULTseçeneği belirleyin ve PHP'nin gelecek sürümleri, kodunuzu güncellemenize gerek kalmadan parola karmaları oluşturmak için otomatik olarak daha güçlü algoritmalar kullanacaktır.



0

Crypto nesnemi çevirebildim

  • Eski verilerin şifresini çözmek için mcrypt ile php'nin bir kopyasını alın. Http://php.net/get/php-7.1.12.tar.gz/from/a/mirror adresine gittim , derledim, sonra ext / mcrypt uzantısını ekledim (configure; make; make install). Php.ini'ye extenstion = mcrypt.so satırını da eklemem gerektiğini düşünüyorum. Tüm veriler şifrelenmemiş olarak verilerin ara sürümlerini oluşturmak için bir dizi komut dosyası.

  • Openssl için genel ve özel bir anahtar oluşturun

    openssl genrsa -des3 -out pkey.pem 2048
    (set a password)
    openssl rsa -in pkey.pem -out pkey-pub.pem -outform PEM -pubout
  • Şifrelemek için (genel anahtar kullanarak) openssl_seal kullanın. Okuduklarıma göre, bir RSA anahtarı kullanan openssl_encrypt, anahtar uzunluğundan 11 bayt daha az ile sınırlıdır (Bkz. Http://php.net/manual/en/function.openssl-public-encrypt.php , Thomas Horsten'in yorumu)

    $pubKey = openssl_get_publickey(file_get_contents('./pkey-pub.pem'));
    openssl_seal($pwd, $sealed, $ekeys, [ $pubKey ]);
    $encryptedPassword = base64_encode($sealed);
    $key = base64_encode($ekeys[0]);

Muhtemelen ham ikili dosyayı depolayabilirsiniz.

  • Şifresini çözmek için (özel anahtar kullanarak)

    $passphrase="passphrase here";
    $privKey = openssl_get_privatekey(file_get_contents('./pkey.pem'), $passphrase);
    // I base64_decode() from my db columns
    openssl_open($encryptedPassword, $plain, $key, $privKey);
    echo "<h3>Password=$plain</h3>";

PS Boş dizeyi ("") şifreleyemezsiniz

PPS Bu, kullanıcı doğrulaması için olmayan bir parola veritabanı içindir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.