mcrypt không được dùng nữa, giải pháp thay thế là gì?


103

Phần mở rộng mcrypt không được dùng nữa sẽ bị xóa trong PHP 7.2 theo nhận xét được đăng tại đây . Vì vậy, tôi đang tìm một cách thay thế để mã hóa mật khẩu.

Ngay bây giờ tôi đang sử dụng một cái gì đó như

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

Tôi cần ý kiến ​​của bạn về cách tốt nhất / mạnh nhất để mã hóa mật khẩu, mật khẩu được mã hóa tất nhiên phải được hỗ trợ bởi PHP 7.xx và cũng phải có thể giải mã được vì khách hàng của tôi muốn có tùy chọn để 'khôi phục' mật khẩu của họ mà không cần tạo mới một.


9
Tại sao bạn cần mã hóa / giải mã mật khẩu? Tại sao không chỉ băm chúng password_hashvà xác minh chúng với password_verify?
Don't Panic

3
"mật khẩu được mã hóa cũng phải giải mã được" - tại sao? âm thanh không quá an toàn. Bất kỳ lý do đặc biệt?
Funk Forty Niner

24
"bởi vì khách hàng của tôi muốn có tùy chọn 'khôi phục' mật khẩu của họ mà không cần tạo mật khẩu mới." - Điều đó không an toàn và họ nên được cung cấp tùy chọn để đặt lại mật khẩu của mình.
Funk Forty Niner 21/12/16

4
Không mã hóa mật khẩu , khi kẻ tấn công lấy được DB thì cũng sẽ lấy được khóa mã hóa. Lặp lại HMAC với một muối ngẫu nhiên trong khoảng thời gian 100ms và lưu muối với hàm băm. Sử dụng các chức năng như password_hash, PBKDF2, Bcrypt và các chức năng tương tự. Vấn đề là làm cho kẻ tấn công mất nhiều thời gian tìm mật khẩu bằng vũ lực.
zaph

2
Từ hướng dẫn sử dụng php -> Chức năng này đã KHÔNG ĐƯỢC SỬ DỤNG kể từ phiên bản PHP 7.1.0. Việc dựa vào chức năng này rất không được khuyến khích. Thay thế là natri -> php.net/manual/en/book.sodium.php
MarcoZen

Câu trả lời:


47

Cách tốt nhất là băm mật khẩu để chúng không thể giải mã được. Điều này làm cho mọi thứ khó khăn hơn một chút đối với những kẻ tấn công có thể đã giành được quyền truy cập vào cơ sở dữ liệu hoặc tệp của bạn.

Nếu bạn phải mã hóa dữ liệu của mình và có thể giải mã được, thì hướng dẫn về mã hóa / giải mã an toàn có sẵn tại https://paragonie.com/white-paper/2015-secure-php-data-encryption . Để tóm tắt liên kết đó:

  • Sử dụng Libsodium - Một phần mở rộng PHP
  • Nếu bạn không thể sử dụng Libsodium, hãy sử dụng mã hóa defuse / php - Mã PHP thẳng
  • Nếu bạn không thể sử dụng Libsodium hoặc loại bỏ mã hóa / php, hãy sử dụng OpenSSL - Rất nhiều máy chủ đã được cài đặt tính năng này. Nếu không, nó có thể được biên dịch bằng --with-openssl [= DIR]

1
Đầu tiên nên thử openssl vì nó rất phổ biến, trong đó libsodium thì không. Không nên sử dụng php thô trừ khi tất cả tiện ích mở rộng tự nhiên đã hết nếu câu hỏi
JSON

mặc dù openssl là rất phổ biến, có vẻ như php 7 sẽ sử dụng libsodium cho lõi mật mã của nó securityintelligence.com/news/...
Shadi

1
Lưu ý có một thư viện gọi Sodium-compat( github.com/paragonie/sodium_compat ) mà công trình trong PHP> = 5.2.4
RaelB

30

Theo đề xuất của @rqLizard , bạn có thể sử dụng các hàm openssl_encrypt/ openssl_decryptPHP để thay thế, cung cấp giải pháp thay thế tốt hơn nhiều để triển khai AES (Tiêu chuẩn mã hóa nâng cao) còn được gọi là mã hóa Rijndael.

Theo nhận xét sau của Scott tại php.net :

Nếu bạn đang viết mã để mã hóa / mã hóa dữ liệu vào năm 2015, bạn nên sử dụng openssl_encrypt()openssl_decrypt(). Thư viện cơ bản ( libmcrypt) đã bị bỏ rơi từ năm 2007 và hoạt động kém hơn nhiều so với OpenSSL (thúc đẩy AES-NIbộ xử lý hiện đại và an toàn về thời gian lưu vào bộ nhớ cache).

Ngoài ra, MCRYPT_RIJNDAEL_256không phải AES-256, đó là một biến thể khác của mật mã khối Rijndael. Nếu bạn muốn AES-256vào mcrypt, bạn phải sử dụng MCRYPT_RIJNDAEL_128với khóa 32 byte. OpenSSL làm cho nó rõ ràng hơn bạn đang sử dụng chế độ nào (tức là aes-128-cbcvs aes-256-ctr).

OpenSSL cũng sử dụng đệm PKCS7 với chế độ CBC thay vì đệm byte NULL của mcrypt. Do đó, mcrypt có nhiều khả năng làm cho mã của bạn dễ bị tấn công bởi các cuộc tấn công thần thánh hơn OpenSSL.

Cuối cùng, nếu bạn không xác thực mật mã của mình (Mã hóa rồi MAC), bạn đang làm sai.

Đọc thêm:

Ví dụ mã

Ví dụ 1

Ví dụ về mã hóa được xác thực AES ở chế độ GCM cho PHP 7.1+

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

Ví dụ số 2

Ví dụ về mã hóa xác thực AES cho PHP 5.6+

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

Ví dụ # 3

Dựa trên các ví dụ trên, tôi đã thay đổi mã sau nhằm mục đích mã hóa id phiên của người dùng:

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

}

thành:

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

}

Để làm rõ, thay đổi trên không phải là một chuyển đổi thực sự vì hai mã hóa sử dụng kích thước khối khác nhau và dữ liệu được mã hóa khác nhau. Ngoài ra, phần đệm mặc định khác, MCRYPT_RIJNDAELchỉ hỗ trợ phần đệm rỗng không theo tiêu chuẩn. @zaph


Ghi chú bổ sung (từ nhận xét của @ zaph):

  • Rijndael 128 ( MCRYPT_RIJNDAEL_128) tương đương với AES , tuy nhiên Rijndael 256 ( MCRYPT_RIJNDAEL_256) không AES-256 là 256 quy định cụ thể một kích thước khối 256-bit, trong khi AES chỉ có một kích thước khối: 128-bit. Vì vậy, về cơ bản Rijndael với kích thước khối 256-bit ( MCRYPT_RIJNDAEL_256) đã bị đặt tên nhầm do sự lựa chọn của các nhà phát triển mcrypt . @zaph
  • Rijndael với kích thước khối 256 có thể kém an toàn hơn với kích thước khối 128-bit vì sau này có nhiều đánh giá và sử dụng hơn. Thứ hai, khả năng tương tác bị cản trở trong khi AES nói chung có sẵn, trong khi Rijndael với kích thước khối 256-bit thì không.
  • Mã hóa với các kích thước khối khác nhau cho Rijndael tạo ra các dữ liệu được mã hóa khác nhau.

    Ví dụ: MCRYPT_RIJNDAEL_256(không tương đương với AES-256) xác định một biến thể khác của mật mã khối Rijndael với kích thước 256 bit và kích thước khóa dựa trên khóa được truyền vào, trong đó aes-256-cbcRijndael có kích thước khối 128 bit với kích thước khóa là 256-bit. Do đó, chúng đang sử dụng các kích thước khối khác nhau tạo ra dữ liệu được mã hóa hoàn toàn khác nhau vì mcrypt sử dụng số để chỉ định kích thước khối, trong đó OpenSSL đã sử dụng số để chỉ định kích thước khóa (AES chỉ có một kích thước khối là 128 bit). Vì vậy, về cơ bản AES là Rijndael với kích thước khối 128 bit và kích thước khóa 128, 192 và 256 bit. Do đó, tốt hơn là sử dụng AES, được gọi là Rijndael 128 trong OpenSSL.


1
Nhìn chung, việc sử dụng Rijndael với kích thước khối 256-bit là một sai lầm do sự lựa chọn của các nhà phát triển mcrypt. Rijndael hơn nữa với kích thước khối 256 có thể kém an toàn hơn với kích thước khối 128-bit vì sau này đã có nhiều đánh giá và sử dụng hơn. Ngoài ra, khả năng tương tác bị cản trở trong khi AES nói chung có sẵn Rijndael với kích thước khối 256-bit thì không.
zaph

Tại sao bạn $session_id = rtrim($decryptedSessionId, "\0");? Có thể openssl_decrypttrả lại một số ký tự không mong muốn cuối cùng? Điều gì sẽ xảy ra nếu biến được mã hóa kết thúc bằng 0 (tức là encrypt("abc0")?
hlscalon

@hiscalon "\0"không phải là "0"ký tự NULL, có mã ASCII là 0x00 (hệ thập lục phân 0).
kiamlaluno

11

Hiện thực Pure-PHP của Rijndael tồn tại với phpseclib có sẵn dưới dạng gói trình soạn thảo và hoạt động trên PHP 7.3 (do tôi thử nghiệm).

Có một trang trên phpseclib docs, tạo mã mẫu sau khi bạn nhập các biến cơ bản (mật mã, chế độ, kích thước khóa, kích thước bit). Nó đầu ra như sau cho Rijndael, ECB, 256, 256:

một mã với mycrypt

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

hoạt động như thế này với thư viện

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

* $termđãbase64_decoded


11

Như chi tiết của các câu trả lời khác ở đây, giải pháp tốt nhất mà tôi tìm thấy là sử dụng OpenSSL. Nó được xây dựng trong PHP và bạn không cần bất kỳ thư viện bên ngoài nào. Dưới đây là các ví dụ đơn giản:

Để mã hóa:

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

Để giải mã:

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

Link tham khảo: https://www.shift8web.ca/2017/04/how-to-encrypt-and-execute-your-php-code-with-mcrypt/


Rất nhiều nghiệp tốt cho bạn bạn! Chỉ một điều: ví dụ: nếu mật khẩu được mã hóa bằng mã cũ, thì mã giải mã mới sẽ không thể xác minh nó. Nó phải được lưu lại và mã hóa bằng mã mới này.
Lumis

Một kịch bản di chuyển đơn giản sẽ giải quyết vấn đề đó. Sử dụng cách cũ để giải mã sau đó sử dụng cách mới để mã hóa và lưu trữ. Giải pháp thay thế là thêm cờ vào bảng của người dùng và viết tập lệnh trong một thiết lập lại mật khẩu bắt buộc trên tất cả các tài khoản người dùng cần thay đổi mật khẩu.
Cecil merrel aka bringrainfire

8

Bạn có thể sử dụng phpseclib gói pollyfill. Bạn không thể sử dụng open ssl hoặc libsodium để mã hóa / giải mã với rijndael 256. Một vấn đề khác, bạn không cần thay thế bất kỳ mã nào.


2
Cảm ơn rất hữu ích Phải xóa phần mở rộng php-mcrypt, và sau đó điều này hoạt động như một sự quyến rũ.
DannyB

Tôi đã cài đặt mcrypt_compatbằng cách chạy composer require phpseclib/mcrypt_compatnhưng tôi vẫn nhận được PHP Fatal error: Uncaught Error: Call to undefined function mcrypt_get_key_size() in /app/kohana/classes/Kohana/Encrypt.php:124Tôi đang sử dụng php 7.2.26và Kohana framwork. Có thêm bước nào để thực hiện sau khi cài đặt nó với composer không?
M-Dahab

Hiểu rồi. Bạn phải thêm require APPPATH . '/vendor/autoload.php';vào cuối bootstrap.php.
M-Dahab

3

Bạn nên sử dụng OpenSSL mcryptvì nó được phát triển và bảo trì tích cực. Nó cung cấp bảo mật, khả năng bảo trì và tính di động tốt hơn. Thứ hai, nó thực hiện mã hóa / giải mã AES nhanh hơn nhiều. Nó sử dụng đệm PKCS7 theo mặc định, nhưng bạn có thể chỉ định OPENSSL_ZERO_PADDINGnếu bạn cần. Để sử dụng với khóa nhị phân 32 byte, bạn có thể chỉ định khóa aes-256-cbcnào rõ ràng hơn nhiều MCRYPT_RIJNDAEL_128.

Đây là ví dụ mã sử dụng Mcrypt:

Thư viện mã hóa AES-256-CBC chưa được xác thực được viết bằng Mcrypt với phần đệm PKCS7.

/**
 * 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');
    }
}

Và đây là phiên bản được viết bằng OpenSSL:

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

Nguồn: Nếu bạn đang gõ từ MCRYPT vào mã PHP của mình, bạn đang làm sai .


2

Tôi đăng bài này rất muộn, nhưng tôi hy vọng nó sẽ giúp ích cho những người khác gặp phải vấn đề tương tự trong phiên bản PHP 7.2x.

Tôi đang sử dụng cái này trên PHP 7.2x, nó hoạt động tốt đối với tôi.

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

và sau đó xác thực hàm băm bằng hàm sau:

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

//thí dụ:

  //create hash from user string

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

và để xác thực hàm băm này, hãy sử dụng mã sau:

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

Đó là tất cả


1

Như đã chỉ ra, bạn không nên lưu trữ mật khẩu của người dùng ở định dạng có thể giải mã được. Mã hóa có thể đảo ngược cung cấp một lộ trình dễ dàng cho tin tặc để tìm ra mật khẩu của người dùng của bạn, điều này mở rộng đến việc đặt tài khoản của người dùng của bạn tại các trang web khác nếu họ sử dụng cùng một mật khẩu ở đó.

PHP cung cấp một cặp hàm mạnh mẽ cho mã hóa băm một chiều, ngẫu nhiên - password_hash()password_verify(). Bởi vì băm được tự động ướp muối ngẫu nhiên, không có cách nào để tin tặc sử dụng các bảng băm mật khẩu được biên dịch sẵn để thiết kế ngược lại mật khẩu. Đặt PASSWORD_DEFAULTtùy chọn và các phiên bản PHP trong tương lai sẽ tự động sử dụng các thuật toán mạnh hơn để tạo các băm mật khẩu mà bạn không cần phải cập nhật mã của mình.



0

Tôi đã có thể dịch đối tượng Crypto của mình

  • Nhận một bản sao của php với mcrypt để giải mã dữ liệu cũ. Tôi truy cập http://php.net/get/php-7.1.12.tar.gz/from/a/mirror , biên dịch nó, sau đó thêm phần mở rộng ext / mcrypt (config; make; make install). Tôi nghĩ rằng tôi cũng phải thêm dòng Extenstion = mcrypt.so vào php.ini. Một loạt các tập lệnh để xây dựng các phiên bản trung gian của dữ liệu với tất cả dữ liệu không được mã hóa.

  • Xây dựng một khóa công khai và riêng tư cho openssl

    openssl genrsa -des3 -out pkey.pem 2048
    (set a password)
    openssl rsa -in pkey.pem -out pkey-pub.pem -outform PEM -pubout
  • Để Mã hóa (sử dụng khóa công khai), hãy sử dụng openssl_seal. Từ những gì tôi đã đọc, openssl_encrypt sử dụng khóa RSA được giới hạn dưới 11 byte so với độ dài khóa (Xem http://php.net/manual/en/ Chức năng.openssl-public-encrypt.php nhận xét của Thomas Horsten)

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

Bạn có thể lưu trữ nhị phân thô.

  • Để giải mã (sử dụng khóa cá nhân)

    $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 Bạn không thể mã hóa chuỗi trống ("")

PPS Đây là dành cho cơ sở dữ liệu mật khẩu không phải để xác thực người dùng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.