mcrypt는 더 이상 사용되지 않습니다. 대안은 무엇입니까?


103

mcrypt-extension은 더 이상 사용되지 않습니다 . 여기에 게시 된 주석에 따라 PHP 7.2에서 제거 됩니다 . 그래서 암호를 암호화하는 다른 방법을 찾고 있습니다.

지금 나는 다음과 같은 것을 사용하고 있습니다.

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

암호를 암호화하는 최선의 / 가장 강력한 방법에 대한 귀하의 의견이 필요합니다. 암호화 된 암호는 물론 PHP 7.xx에서 지원해야하며, 고객이 새 암호를 생성하지 않고 암호를 '복구'하는 옵션을 원하기 때문에 암호 해독이 가능해야합니다. 하나.


9
암호를 암호화 / 복호화해야하는 이유는 무엇입니까? 왜 그들을 해시 password_hash하고 검증하지 password_verify않습니까?
당황하지 마십시오

3
"암호화 된 암호도 해독 가능해야합니다." -그 이유는 무엇입니까? 너무 안전하지 않은 것 같습니다. 특별한 이유가 있습니까?
Funk Forty Niner

24
"고객이 새 비밀번호를 생성하지 않고 비밀번호를 '복구'할 수있는 옵션을 원하기 때문입니다." -안전하지 않으며 대신 비밀번호를 재설정 할 수있는 옵션이 제공되어야합니다.
Funk Forty Niner

4
암호를 암호화하지 마십시오 . 공격자가 DB를 가져 오면 암호화 키도 얻게됩니다. 약 100ms 동안 무작위 솔트로 HMAC를 반복하고 해시로 솔트를 저장합니다. password_hash, PBKDF2, Bcrypt 및 유사한 기능과 같은 기능을 사용하십시오. 요점은 공격자가 무차별 대입으로 암호를 찾는 데 많은 시간을 소비하도록 만드는 것입니다.
zaph

2
PHP 매뉴얼에서->이 함수는 PHP 7.1.0부터 사용되지 않습니다. 이 기능에 의존하는 것은 매우 권장되지 않습니다. > - 대체 나트륨이다 php.net/manual/en/book.sodium.php
MarcoZen

답변:


47

암호를 해독 할 수 없도록 해시하는 것이 가장 좋습니다. 이로 인해 데이터베이스 또는 파일에 액세스 할 수있는 공격자가 작업을 약간 더 어렵게 만듭니다.

데이터를 암호화하고 복호화 할 수 있어야하는 경우 안전한 암호화 / 복호화 가이드는 https://paragonie.com/white-paper/2015-secure-php-data-encryption 에서 제공됩니다 . 그 링크를 요약하면 :

  • Libsodium 사용 -PHP 확장
  • Libsodium을 사용할 수 없다면 defuse / php-encryption을 사용하세요-Straight PHP code
  • Libsodium 또는 defuse / php-encryption을 사용할 수없는 경우 OpenSSL을 사용 하세요. 많은 서버에 이미이 기능이 설치되어 있습니다. 그렇지 않은 경우 --with-openssl [= DIR]로 컴파일 할 수 있습니다.

1
libsodium이 아닌 매우 일반적이기 때문에 먼저 openssl을 시도해야합니다. 질문 인 경우 모든 기본 확장이 나오지 않는 한 원시 PHP를 사용해서는 안됩니다
JSON

OpenSSL을 매우 일반적입니다하더라도, 그것은 7 핵심 암호화에 대한 libsodium 사용하게 될 것이다 PHP 보인다 securityintelligence.com/news/...
샤디

1
PHP> = 5.2.4에서 작동 하는 라이브러리 Sodium-compat( github.com/paragonie/sodium_compat )가 있습니다.
RaelB

30

@rqLizard가 제안한 대로 Rijndael 암호화라고도 하는 AES (고급 암호화 표준) 를 구현하는 훨씬 더 나은 대안을 제공하는 openssl_encrypt/ openssl_decryptPHP 함수를 대신 사용할 수 있습니다 .

php.net에서 다음 Scott의 의견에 따라 :

2015 년에 데이터를 암호화 / 암호화하는 코드를 작성하는 경우 openssl_encrypt()openssl_decrypt(). 기본 라이브러리 ( libmcrypt)는 2007 년부터 폐기되었으며 OpenSSL ( AES-NI최신 프로세서 를 활용 하고 캐시 타이밍에 안전함) 보다 성능이 훨씬 떨어졌습니다 .

또한 MCRYPT_RIJNDAEL_256아니다 AES-256그것은 Rijndael을 암호화 블록의 다른 변형 예이다. AES-256에서 원하는 경우 32 바이트 키와 함께 mcrypt사용해야 MCRYPT_RIJNDAEL_128합니다. OpenSSL은 사용중인 모드 (예 : aes-128-cbcvs aes-256-ctr) 를보다 명확하게 보여줍니다 .

OpenSSL은 또한 mcrypt의 NULL 바이트 패딩 대신 CBC 모드로 PKCS7 패딩을 사용합니다. 따라서 mcrypt는 OpenSSL보다 패딩 오라클 공격에 코드를 취약하게 만들 가능성이 높습니다.

마지막으로 암호문을 인증하지 않으면 (Encrypt Then MAC) 잘못된 것입니다.

추가 읽기 :

코드 예

예 1

PHP 7.1+ 용 GCM 모드의 AES 인증 암호화 예제

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

예제 # 2

PHP 5.6+ 용 AES 인증 암호화 예제

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

예 # 3

위의 예를 기반으로 사용자의 세션 ID를 암호화하는 것을 목표로하는 다음 코드를 변경했습니다.

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

}

으로:

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

}

명확히하기 위해 두 암호화는 다른 블록 크기와 다른 암호화 된 데이터를 사용하므로 위의 변경은 진정한 변환이 아닙니다. 또한 기본 패딩은 다르며 MCRYPT_RIJNDAEL비표준 널 패딩 만 지원합니다. @zaph


추가 참고 사항 (@zaph의 의견) :

  • Rijndael 128 ( MCRYPT_RIJNDAEL_128) AES 와 동일 하지만 Rijndael 256 ( MCRYPT_RIJNDAEL_256) AES-256 이 아닙니다 . 256은 256 비트의 블록 크기를 지정하는 반면 AES 에는 128 비트의 블록 크기 만 있습니다. 따라서 기본적으로 블록 크기가 256 비트 ( MCRYPT_RIJNDAEL_256) 인 Rijndael 은 mcrypt 개발자 의 선택으로 인해 잘못 명명되었습니다 . @zaph
  • 블록 크기가 256 인 Rijndael은 128 비트의 블록 크기보다 안전하지 않을 수 있습니다. 후자는 훨씬 더 많은 리뷰와 사용을 가지고 있기 때문입니다. 둘째, AES는 일반적으로 사용 가능하지만 블록 크기가 256 비트 인 Rijndael은 사용할 수 없다는 점에서 상호 운용성이 저해됩니다.
  • Rijndael에 대해 서로 다른 블록 크기로 암호화하면 서로 다른 암호화 된 데이터가 생성됩니다.

    예를 들어, MCRYPT_RIJNDAEL_256(와 동일하지 않음 AES-256)은 256 비트 크기와 전달 된 키를 기반으로하는 키 크기를 가진 Rijndael 블록 암호의 다른 변형을 정의합니다. 여기서 aes-256-cbcRijndael은 키 크기가 128 비트이고 블록 크기가 다음과 같습니다. 256 비트. 따라서 그들은 mcrypt가 블록 크기를 지정하기 위해 숫자를 사용하기 때문에 완전히 다른 암호화 된 데이터를 생성하는 다른 블록 크기를 사용하고 있습니다. 여기서 OpenSSL은 키 크기를 지정하기 위해 숫자를 사용했습니다 (AES는 128 비트의 한 블록 크기 만 있습니다). 따라서 기본적으로 AES는 블록 크기가 128 비트이고 키 크기가 128, 192 및 256 비트 인 Rijndael입니다. 따라서 OpenSSL에서 Rijndael 128이라고하는 AES를 사용하는 것이 좋습니다.


1
일반적으로 블록 크기가 256 비트 인 Rijndael을 사용하는 것은 mcrypt 개발자의 선택으로 인한 실수입니다. 256의 블록 크기를 가진 추가 Rijndael은 128 비트의 블록 크기를 사용하는 것보다 덜 안전 할 수 있습니다. 왜냐하면 후자는 훨씬 더 많은 검토와 사용을 가지고 있기 때문입니다. 또한 AES는 일반적으로 사용 가능하지만 블록 크기가 256 비트 인 Rijndael은 그렇지 않다는 점에서 상호 운용성이 저해됩니다.
zaph

왜 그래요 $session_id = rtrim($decryptedSessionId, "\0");? openssl_decrypt결국 원하지 않는 문자를 반환 할 수 있습니까? 암호화 된 변수가 0으로 끝나는 경우 (예 : encrypt("abc0")?
hlscalon

@hiscalon "\0""0"ASCII 코드가 0x00 (16 진수 0) 인 NULL 문자입니다.
kiamlaluno

11

Rijndael의 Pure-PHP 구현은 composer 패키지로 사용 가능한 phpseclib 와 함께 존재하며 PHP 7.3에서 작동합니다 (내가 테스트 함).

phpseclib 문서 에는 기본 변수 (암호, 모드, 키 크기, 비트 크기)를 입력 한 후 샘플 코드생성 하는 페이지가 있습니다 . Rijndael, ECB, 256, 256에 대해 다음을 출력합니다.

mycrypt가있는 코드

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

라이브러리에서 이와 같이 작동합니다.

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

* $termbase64_decoded


11

여기에 다른 답변에서 자세히 설명했듯이 내가 찾은 최고의 솔루션은 OpenSSL을 사용하는 것입니다. PHP에 내장되어 있으며 외부 라이브러리가 필요하지 않습니다. 다음은 간단한 예입니다.

암호화하려면 :

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

암호를 해독하려면 :

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

참조 링크 : https://www.shift8web.ca/2017/04/how-to-encrypt-and-execute-your-php-code-with-mcrypt/


당신 친구에게 많은 좋은 업장! 예를 들어 암호가 이전 코드로 암호화 된 경우 새 암호 해독 코드는이를 확인할 수 없습니다. 이 새 코드로 다시 저장하고 암호화해야합니다.
Lumis 2019 년

간단한 마이그레이션 스크립트로이 문제를 해결할 수 있습니다. 이전 방법을 사용하여 해독 한 다음 새로운 방법으로 암호화하고 저장하십시오. 대안은 사용자 테이블에 플래그를 추가하고 암호 변경이 필요한 모든 사용자 계정에 대해 강제 암호 재설정에서 스크립팅하는 것입니다.
세실 merrel 일명 bringrainfire

8

phpseclib pollyfill 패키지를 사용할 수 있습니다 . rijndael 256으로 암호화 / 복호화를 위해 open ssl 또는 libsodium을 사용할 수 없습니다. 또 다른 문제는 코드를 교체 할 필요가 없다는 것입니다.


2
이것은 매우 도움이되는 감사였습니다. php-mcrypt 확장을 제거해야했고, 이것은 매력처럼 작동합니다.
DannyB

mcrypt_compat실행하여 설치 composer require phpseclib/mcrypt_compat했지만 여전히 PHP Fatal error: Uncaught Error: Call to undefined function mcrypt_get_key_size() in /app/kohana/classes/Kohana/Encrypt.php:124php 7.2.26와 Kohana 프레임 워크를 사용 하고 있습니다. composer와 함께 설치 한 후 수행 할 단계가 더 있습니까?
M-Dahab

알았다. require APPPATH . '/vendor/autoload.php';의 하단에 추가 해야합니다 bootstrap.php.
M-Dahab

3

OpenSSL mcrypt은 활발하게 개발되고 유지되므로 사용해야 합니다. 더 나은 보안, 유지 관리 및 이식성을 제공합니다. 둘째, AES 암호화 / 복호화를 훨씬 빠르게 수행합니다. 기본적으로 PKCS7 패딩을 사용하지만 OPENSSL_ZERO_PADDING필요한 경우 지정할 수 있습니다. 32 바이트 이진 키를 사용하려면 지정할 수 aes-256-cbc보다 훨씬 명백하다 MCRYPT_RIJNDAEL_128.

다음은 Mcrypt를 사용하는 코드 예제입니다.

PKCS7 패딩을 사용하여 Mcrypt로 작성된 인증되지 않은 AES-256-CBC 암호화 라이브러리입니다.

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

다음은 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
        );
    }
}

출처 : PHP 코드에 MCRYPT라는 단어를 입력하는 경우 잘못하고있는 것 입니다.


2

PHP 7.2.x에서 이것을 사용하고 있으며 잘 작동합니다.

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

다음 함수를 사용하여 해시를 인증합니다.

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

예:

  //create hash from user string

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

이 해시를 인증하려면 다음 코드를 사용하십시오.

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

그게 다야.


1

지적했듯이 사용자의 암호를 해독 가능한 형식으로 저장해서는 안됩니다. 해독 가능한 암호화는 해커가 사용자의 암호를 쉽게 찾을 수있는 경로를 제공하며, 이는 사용자가 동일한 암호를 사용할 경우 다른 사이트에 사용자 계정을 위험에 노출시키는 것으로 확장됩니다.

PHP는 랜덤 소금, 단방향 해시 암호화를위한 강력한 기능의 쌍을 제공합니다 - password_hash()password_verify(). 해시는 자동으로 무작위로 염분 처리되기 때문에 해커가 미리 컴파일 된 암호 해시 테이블을 활용하여 암호를 리버스 엔지니어링 할 수있는 방법이 없습니다. PASSWORD_DEFAULT옵션을 설정하면 PHP의 향후 버전은 코드를 업데이트 할 필요없이 자동으로 강력한 알고리즘을 사용하여 암호 해시를 생성합니다.



0

내 Crypto 개체를 번역 할 수있었습니다.

  • 이전 데이터를 해독하기 위해 mcrypt로 PHP 사본을 가져옵니다. http://php.net/get/php-7.1.12.tar.gz/from/a/mirror 로 이동하여 컴파일 한 다음 ext / mcrypt 확장 (configure; make; make install)을 추가했습니다. php.ini에도 extenstion = mcrypt.so 줄을 추가해야한다고 생각합니다. 모든 데이터가 암호화되지 않은 상태에서 중간 버전의 데이터를 빌드하는 일련의 스크립트입니다.

  • openssl에 대한 공개 및 개인 키 빌드

    openssl genrsa -des3 -out pkey.pem 2048
    (set a password)
    openssl rsa -in pkey.pem -out pkey-pub.pem -outform PEM -pubout
  • 암호화하려면 (공개 키 사용) openssl_seal을 사용합니다. 내가 읽은 바에 따르면 RSA 키를 사용하는 openssl_encrypt는 키 길이보다 11 바이트 작게 제한됩니다 ( Thomas Horsten의 http://php.net/manual/en/function.openssl-public-encrypt.php 주석 참조 ).

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

원시 바이너리를 저장할 수 있습니다.

  • 해독하려면 (개인 키 사용)

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

추신 : 빈 문자열 ( "")을 암호화 할 수 없습니다.

PPS 이것은 사용자 검증이 아닌 암호 데이터베이스 용입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.