programing

양방향 암호화:검색할 수 있는 암호를 저장해야 합니다.

minecode 2022. 9. 22. 21:57
반응형

양방향 암호화:검색할 수 있는 암호를 저장해야 합니다.

패스워드를 저장하는 어플리케이션을 만들고 있습니다.이 어플리케이션은 사용자가 검색하여 볼 수 있습니다.패스워드는 하드웨어 디바이스용이므로 해시와의 대조는 불가능합니다.

내가 알아야 할 것은:

  1. PHP에서 암호를 암호화 및 해독하려면 어떻게 해야 합니까?

  2. 패스워드를 암호화하는 가장 안전한 알고리즘은 무엇입니까?

  3. 개인키는 어디에 보관하나요?

  4. 개인 키를 저장하는 대신 사용자가 암호를 해독해야 할 때마다 개인 키를 입력하도록 요구하는 것이 좋은 생각일까요?(이 어플리케이션의 사용자는 신뢰할 수 있습니다)

  5. 패스워드는 어떤 방법으로 도난 및 복호화할 수 있습니까?어떤 점에 유의해야 합니까?

는 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★mcrypt 아직 점이 있습니다.하지만 주목할 게 더 많아

  1. PHP에서 암호를 암호화 및 해독하려면 어떻게 해야 합니까?

    모든 것을 지원하는 강력한 클래스에 대해서는 아래를 참조하십시오.

  2. 패스워드를 암호화하는 가장 안전한 알고리즘은 무엇입니까?

    가장 안전하다고요? 그 중 하나죠암호화할 경우 가장 안전한 방법은 정보 노출 취약성(XSS, 원격 포함 등)으로부터 보호하는 것입니다.이 키가 유출되면 공격자는 최종적으로 암호화를 해제할 수 있습니다(키가 없으면 암호화가 100% 복구되지 않습니다). @NullUserException에서 지적했듯이 이는 완전히 사실이 아닙니다.원타임 패드와 같이 해독할 수 없는 암호화 스킴이 있습니다.

  3. 개인키는 어디에 보관하나요?

    열쇠 세 개를 쓰겠습니다.하나는 사용자 제공, 하나는 애플리케이션 고유, 다른 하나는 사용자 고유(솔트 등)입니다.응용 프로그램별 키는 웹 루트 외부의 구성 파일, 환경 변수 등에 어디에나 저장할 수 있습니다.사용자 고유의 암호는 암호화된 암호 옆의 DB 열에 저장됩니다.사용자가 제공한 것은 저장되지 않습니다.그런 다음 다음과 같은 작업을 수행합니다.

    $key = $userKey . $serverKey . $userSuppliedKey;
    

    여기서 얻을 수 있는 이점은 데이터를 손상시키지 않고 두 개의 키를 손상시킬 수 있다는 것입니다.SQL 주입 공격이 있을 경우, 이 공격들은$userKey부정 「」를 취득할 수 .$userKey ★★★★★★★★★★★★★★★★★」$serverKey 세 번째입니다.$userSuppliedKey$userSuppliedKey그러나 나머지 두 개는 그렇지 않습니다(하지만 사용자가 렌치로 두들겨 맞으면 어쨌든 너무 늦습니다).

  4. 개인 키를 저장하는 대신 사용자가 암호를 해독해야 할 때마다 개인 키를 입력하도록 요구하는 것이 좋은 생각일까요?(이 어플리케이션의 사용자는 신뢰할 수 있습니다)

    그렇고 말고요.사실, 그게 내가 할 수 있는 유일한 방법이야.그렇지 않으면 암호화되지 않은 버전을 내구성이 뛰어난 스토리지 형식(APC, Memcached 등의 공유 메모리 또는 세션 파일)으로 저장해야 합니다.그것은 자신을 추가적인 타협에 노출시키는 것이다.암호화되지 않은 비밀번호 버전은 로컬 변수 이외의 어떤 것에도 저장하지 마십시오.

  5. 패스워드는 어떤 방법으로 도난 및 복호화할 수 있습니까?어떤 점에 유의해야 합니까?

    어떠한 형태로든 시스템이 손상되면 암호화된 데이터를 볼 수 있습니다.코드를 삽입하거나 파일 시스템에 액세스 할 수 있는 경우, 복호화된 데이터를 표시할 수 있습니다(데이터를 복호화하는 파일을 편집할 수 있기 때문입니다).또한 어떤 형태의 재생 또는 MITM 공격도 관련된 키에 대한 완전한 액세스를 제공합니다.raw HTTP 트래픽을 스니핑하면 키도 얻을 수 있습니다.

    모든 트래픽에 SSL을 사용합니다.또한 서버에 어떠한 취약성(CSRF, XSS, SQL 주입, 권한 상승, 원격 코드 실행 등)도 없는 것을 확인합니다.

다음은 강력한 암호화 방식의 PHP 클래스 구현입니다.

/**
 * A class to handle secure encryption and decryption of arbitrary data
 *
 * Note that this is not just straight encryption.  It also has a few other
 *  features in it to make the encrypted data far more secure.  Note that any
 *  other implementations used to decrypt data will have to do the same exact
 *  operations.
 *
 * Security Benefits:
 *
 * - Uses Key stretching
 * - Hides the Initialization Vector
 * - Does HMAC verification of source data
 *
 */
class Encryption {

    /**
     * @var string $cipher The mcrypt cipher to use for this instance
     */
    protected $cipher = '';

    /**
     * @var int $mode The mcrypt cipher mode to use
     */
    protected $mode = '';

    /**
     * @var int $rounds The number of rounds to feed into PBKDF2 for key generation
     */
    protected $rounds = 100;

    /**
     * Constructor!
     *
     * @param string $cipher The MCRYPT_* cypher to use for this instance
     * @param int    $mode   The MCRYPT_MODE_* mode to use for this instance
     * @param int    $rounds The number of PBKDF2 rounds to do on the key
     */
    public function __construct($cipher, $mode, $rounds = 100) {
        $this->cipher = $cipher;
        $this->mode = $mode;
        $this->rounds = (int) $rounds;
    }

    /**
     * Decrypt the data with the provided key
     *
     * @param string $data The encrypted datat to decrypt
     * @param string $key  The key to use for decryption
     *
     * @returns string|false The returned string if decryption is successful
     *                           false if it is not
     */
    public function decrypt($data, $key) {
        $salt = substr($data, 0, 128);
        $enc = substr($data, 128, -64);
        $mac = substr($data, -64);

        list ($cipherKey, $macKey, $iv) = $this->getKeys($salt, $key);

        if (!hash_equals(hash_hmac('sha512', $enc, $macKey, true), $mac)) {
             return false;
        }

        $dec = mcrypt_decrypt($this->cipher, $cipherKey, $enc, $this->mode, $iv);

        $data = $this->unpad($dec);

        return $data;
    }

    /**
     * Encrypt the supplied data using the supplied key
     *
     * @param string $data The data to encrypt
     * @param string $key  The key to encrypt with
     *
     * @returns string The encrypted data
     */
    public function encrypt($data, $key) {
        $salt = mcrypt_create_iv(128, MCRYPT_DEV_URANDOM);
        list ($cipherKey, $macKey, $iv) = $this->getKeys($salt, $key);

        $data = $this->pad($data);

        $enc = mcrypt_encrypt($this->cipher, $cipherKey, $data, $this->mode, $iv);

        $mac = hash_hmac('sha512', $enc, $macKey, true);
        return $salt . $enc . $mac;
    }

    /**
     * Generates a set of keys given a random salt and a master key
     *
     * @param string $salt A random string to change the keys each encryption
     * @param string $key  The supplied key to encrypt with
     *
     * @returns array An array of keys (a cipher key, a mac key, and a IV)
     */
    protected function getKeys($salt, $key) {
        $ivSize = mcrypt_get_iv_size($this->cipher, $this->mode);
        $keySize = mcrypt_get_key_size($this->cipher, $this->mode);
        $length = 2 * $keySize + $ivSize;

        $key = $this->pbkdf2('sha512', $key, $salt, $this->rounds, $length);

        $cipherKey = substr($key, 0, $keySize);
        $macKey = substr($key, $keySize, $keySize);
        $iv = substr($key, 2 * $keySize);
        return array($cipherKey, $macKey, $iv);
    }

    /**
     * Stretch the key using the PBKDF2 algorithm
     *
     * @see http://en.wikipedia.org/wiki/PBKDF2
     *
     * @param string $algo   The algorithm to use
     * @param string $key    The key to stretch
     * @param string $salt   A random salt
     * @param int    $rounds The number of rounds to derive
     * @param int    $length The length of the output key
     *
     * @returns string The derived key.
     */
    protected function pbkdf2($algo, $key, $salt, $rounds, $length) {
        $size   = strlen(hash($algo, '', true));
        $len    = ceil($length / $size);
        $result = '';
        for ($i = 1; $i <= $len; $i++) {
            $tmp = hash_hmac($algo, $salt . pack('N', $i), $key, true);
            $res = $tmp;
            for ($j = 1; $j < $rounds; $j++) {
                 $tmp  = hash_hmac($algo, $tmp, $key, true);
                 $res ^= $tmp;
            }
            $result .= $res;
        }
        return substr($result, 0, $length);
    }

    protected function pad($data) {
        $length = mcrypt_get_block_size($this->cipher, $this->mode);
        $padAmount = $length - strlen($data) % $length;
        if ($padAmount == 0) {
            $padAmount = $length;
        }
        return $data . str_repeat(chr($padAmount), $padAmount);
    }

    protected function unpad($data) {
        $length = mcrypt_get_block_size($this->cipher, $this->mode);
        $last = ord($data[strlen($data) - 1]);
        if ($last > $length) return false;
        if (substr($data, -1 * $last) !== str_repeat(chr($last), $last)) {
            return false;
        }
        return substr($data, 0, -1 * $last);
    }
}

저는 PHP 5.6에 추가된 함수를 사용하고 있습니다.만약 당신이 5.6보다 낮은 버전이라면, 당신은 이중 HMAC 검증을 사용하여 타이밍 세이프 비교 기능을 구현하는 이 대체 함수를 사용할 수 있습니다.

function hash_equals($a, $b) {
    $key = mcrypt_create_iv(128, MCRYPT_DEV_URANDOM);
    return hash_hmac('sha512', $a, $key) === hash_hmac('sha512', $b, $key);
}

사용방법:

$e = new Encryption(MCRYPT_BLOWFISH, MCRYPT_MODE_CBC);
$encryptedData = $e->encrypt($data, $key);

다음으로 복호화 방법:

$e2 = new Encryption(MCRYPT_BLOWFISH, MCRYPT_MODE_CBC);
$data = $e2->decrypt($encryptedData, $key);

「 」를 사용하고 있는 .$e2다른 인스턴스를 두 번째로 표시해도 데이터는 올바르게 복호화됩니다.

그럼 어떻게 작동합니까?/다른 솔루션에서 사용하는 이유는 무엇입니까?

  1. 열쇠들.
  • 키는 직접 사용되지 않습니다.대신 키는 표준 PBKDF2 파생에 의해 연장됩니다.

  • 암호화에 사용되는 키는 암호화된 텍스트 블록마다 고유합니다.따라서 제공된 키가 "마스터 키"가 됩니다.따라서 이 클래스는 암호 키와 인증 키의 키 순환을 제공합니다.

  • 중요한 주의:$rounds파라미터는 충분한 강도를 가진 진정한 랜덤키(최소 128비트의 암호화 보안 랜덤)에 대해 설정됩니다.패스워드 또는 비랜덤키(또는 랜덤 CS의 128비트 미만)를 사용하는 경우 이 파라미터를 늘려야 합니다.패스워드는 최소 10000을 권장합니다(비용이 많이 들수록 좋지만 실행 시간이 늘어납니다).

  1. 데이터 무결성
  • 갱신된 버전에서는 암호화 데이터의 신뢰성을 보증하기 위한 훨씬 더 좋은 방법인 ENCRITE-THEN-MAC을 사용합니다.
  1. 암호화:
  • 맥크립트 중 하나를 사용하는 .MCRYPT_BLOWFISH ★★★★★★★★★★★★★★★★★」MCRYPT_RIJNDAEL_128와 사이퍼MCRYPT_MODE_CBC를 선택합니다.이 기능은 충분히 강력하지만 여전히 매우 빠릅니다(내 기계에서는 암호화 및 암호 해독 주기가 약 1/2초 소요됨).

첫 번째 리스트의 포인트 3에서 다음과 같은 기능을 얻을 수 있습니다.

function makeKey($userKey, $serverKey, $userSuppliedKey) {
    $key = hash_hmac('sha512', $userKey, $serverKey);
    $key = hash_hmac('sha512', $key, $userSuppliedKey);
    return $key;
}

쭉쭉 뻗으면 될 것 같아요.makeKey()나중에 늘어나기 때문에 큰 의미가 없습니다.

저장소 크기는 일반 텍스트에 따라 다릅니다.복어는 8바이트 블록 크기를 사용하기 때문에 다음과 같은 이점을 얻을 수 있습니다.

  • 16 바이트 (솔트)
  • hmac의 경우 64바이트
  • data 길이
  • 데이터 길이 % 8 == 0이 되도록 패딩

따라서 데이터 소스가 16자일 경우 암호화되는 데이터는 16자입니다.즉, 패딩으로 인해 실제 암호화된 데이터 크기는 16바이트입니다.그런 다음 salt의 경우 16바이트, hmac의 경우 64바이트를 더하면 총 저장된 크기가 96바이트가 됩니다.그러니까 기껏해야 80자, 기껏해야 87자...

PHP에서 암호를 암호화 및 해독하려면 어떻게 해야 합니까?

여러 암호화 알고리즘 중 하나를 구현(또는 여러 라이브러리 중 하나를 사용)하여

패스워드를 암호화하는 가장 안전한 알고리즘은 무엇입니까?

다양한 알고리즘이 있지만 100% 안전한 알고리즘은 없습니다.하지만 그들 중 다수는 상업이나 심지어 군사 목적으로도 충분히 안전하다.

개인키는 어디에 보관하나요?

공개 키 암호화 알고리즘(예: RSA)을 구현하기로 결정한 경우에는 개인 키를 저장하지 않습니다.사용자에게 개인 키가 있습니다.시스템에는 원하는 위치에 저장할 수 있는 공용 키가 있습니다.

개인 키를 저장하는 대신 사용자가 암호를 해독해야 할 때마다 개인 키를 입력하도록 요구하는 것이 좋은 생각일까요?(이 어플리케이션의 사용자는 신뢰할 수 있습니다)

음, 만약 당신의 사용자가 터무니없이 긴 소수들을 기억할 수 있다면 - 네, 그럴 수 없습니다.그러나 일반적으로 사용자가 자신의 키를 어딘가에 저장할 수 있는 시스템을 고안해야 합니다.

패스워드는 어떤 방법으로 도난 및 복호화할 수 있습니까?어떤 점에 유의해야 합니까?

이것은, 사용하는 알고리즘에 의해서 다릅니다.그러나 항상 암호화되지 않은 비밀번호를 사용자에게 발송하지 마십시오.클라이언트측에서 암호화/복호화하거나 HTTPS(또는 서버와 클라이언트간의 접속을 보호하기 위한 다른 암호화 수단)를 사용합니다.

다만, 패스워드를 암호화해 보존하기만 하면 되는 경우는, 간단한 XOR 암호를 사용하는 것을 추천합니다.이 알고리즘의 주요 문제는 주파수 분석에 의해 쉽게 깨질 수 있다는 것입니다.그러나 일반적으로 비밀번호는 영문 텍스트의 긴 단락으로 만들어지지 않기 때문에 걱정할 필요는 없다고 생각합니다.XOR 암호의 두 번째 문제는 암호화된 형식과 복호화된 형식의 메시지가 있는 경우 암호화된 암호를 쉽게 찾을 수 있다는 것입니다.다시 말씀드리지만, 다른 방법으로 이미 피해를 입은 사용자에게만 영향을 미치기 때문에 귀하의 경우 큰 문제가 되지 않습니다.

  1. 당신이 찾고 있는 PHP 모듈은 Mcrypt입니다.

    매뉴얼의 예는 이 예에 대해 약간 편집되어 있습니다).

    <?php
        $iv_size = mcrypt_get_iv_size(MCRYPT_BLOWFISH, MCRYPT_MODE_ECB);
        $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
        $key = "This is a very secret key";
        $pass = "PasswordHere";
        echo strlen($pass) . "\n";
    
        $crypttext = mcrypt_encrypt(MCRYPT_BLOWFISH, $key, $pass, MCRYPT_MODE_ECB, $iv);
        echo strlen($crypttext) . "\n";
    ?>
    

    mcrypt_microsoft를 사용하여 암호를 해독합니다.

  2. 가장 좋은 알고리즘은 다소 주관적입니다. 5명에게 물어보고 5개의 답을 얻으십시오.개인적으로, 디폴트(복어)가 당신에게 충분하지 않다면, 당신은 아마도 더 큰 문제를 가지고 있을 것입니다!

  3. PHP가 암호화하는 데 필요하기 때문에 어디에도 숨길 수 있을지 모르겠습니다.물론 표준 PHP 모범 코딩 프랙티스가 적용됩니다!

  4. 암호화 키는 어쨌든 코드에 포함되어 있기 때문에, 애플리케이션의 나머지 부분이 안전하다면 무엇을 얻을 수 있을지 모르겠습니다.

  5. 암호화된 비밀번호와 암호화 키를 도난당하면 게임 오버가 됩니다.

나는 내 대답에 기수를 붙일 것이다.저는 PHP 암호화 전문가는 아니지만, 제가 대답한 것은 표준적인 프랙티스라고 생각합니다.

많은 사용자들이 mcrypt를 사용할 것을 제안하고 있습니다.맞습니다만, 한 걸음 더 나아가 저장 및 전송이 용이하도록 하겠습니다(암호화된 값은 cURL이나 JSON 등의 다른 테크놀로지를 사용하여 전송하기 어려울 수 있습니다).

mcrypt를 사용하여 정상적으로 암호화한 후 base64_encode에서 실행한 후 16진수 코드로 변환합니다.일단 16진수 코드에 들어가면, 다양한 방법으로 전송이 용이합니다.

$td = mcrypt_module_open('tripledes', '', 'ecb', '');
$iv = mcrypt_create_iv (mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
$key = substr("SUPERSECRETKEY", 0, mcrypt_enc_get_key_size($td));
mcrypt_generic_init($td, $key, $iv);
$encrypted = mcrypt_generic($td, $unencrypted);
$encrypted = $ua . "||||" . $iv;
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
$encrypted = base64_encode($encrypted);
$encrypted = array_shift(unpack('H*', $encrypted));

그리고 다른 쪽에는:

$encrypted = pack('H*', $encrypted);
$encrypted = base64_decode($encrypted);
list($encrypted, $iv) = explode("||||", $encrypted, 2);
$td = mcrypt_module_open('tripledes', '', 'ecb', '');
$key = substr("SUPERSECRETKEY", 0, mcrypt_enc_get_key_size($td));
mcrypt_generic_init($td, $key, $iv);
$unencrypted = mdecrypt_generic($td, $encrypted);
mcrypt_generic_deinit($td);
mcrypt_module_close($td);

사용자의 상호 작용 없이 사용자의 암호를 설정할 수 있는 기능을 원하는 경우에만 공개 키 암호화를 권장합니다(이 기능은 재설정 및 공유 암호에 유용합니다).

공개 키

  1. OpenSSL 확장자, 특히openssl_public_encrypt ★★★★★★★★★★★★★★★★★」openssl_private_decrypt
  2. 패스워드가 키 사이즈에 맞는다고 가정하면, 이것은 스트레이트 RSA가 됩니다.그렇지 않으면 대칭 레이어가 필요합니다.
  3. 각 사용자에 대해 두 키를 모두 저장합니다. 개인 키의 암호는 응용 프로그램 암호입니다.

대칭

  1. Mcrypt 확장자
  2. 아마도 AES-256이 안전할 것입니다만, 이것 자체가 SO에 관한 질문일 가능성이 있습니다.
  3. 그렇지 않습니다. 이것은 응용 프로그램 비밀번호가 됩니다.

둘다요.

4네 - 매번 를 입력해야 하면 가 발생합니다 네 - 사용자는 매번 응용 프로그램 비밀번호를 입력해야 하지만 세션에 저장하면 다른 문제가 발생합니다.

5.

  • 응용 프로그램 데이터를 도용한 경우 대칭 암호만큼 안전합니다(공개 키 방식의 경우 암호 구문을 사용하여 개인 키를 보호하는 데 사용됩니다).
  • 응용 프로그램은 SSL을 통해서만 액세스할 수 있어야 하며, 가급적 클라이언트 인증서를 사용해야 합니다.
  • SMS를 통해 전송되는 토큰과 같이 세션당 한 번만 사용되는 두 번째 인증 요소를 추가하는 것을 고려해 보십시오.

패스워드는 하드웨어 디바이스용이므로 해시에 대한 체크는 불가능합니다.

네? 이해가 안 돼요패스워드가 복구 가능해야 한다는 뜻인가요?

다른 사람들이 말했듯이 mcrypt 확장은 많은 암호화 기능에 대한 접근을 제공합니다.다만, 공격자의 타겟이 될 가능성이 있는 모든 에그를 1개의 바구니에 넣도록 사용자를 초대하고 있습니다.또한 문제를 해결하는 방법조차 모르면 사용자에게 피해를 주는 것입니다.데이터를 보호하는 방법을 이해할 수 있는 위치에 있지 않습니다.

대부분의 보안 취약성은 기본 알고리즘에 결함이 있거나 안전하지 않기 때문이 아니라 애플리케이션 코드 내에서 알고리즘을 사용하는 방식에 문제가 있기 때문에 발생합니다.

그렇다고 해도, 합리적으로 안전한 시스템을 구축하는 것은 가능합니다.

사용자가 다른 (특정) 사용자가 읽을 수 있는 안전한 메시지를 작성해야 하는 경우에만 비대칭 암호화를 고려해야 합니다.그 이유는 계산 비용이 많이 들기 때문입니다.사용자가 자신의 데이터를 입력하고 검색할 수 있는 저장소만 제공하려는 경우 대칭 암호화로 충분합니다.

단, 메시지 복호화 키를 암호화된 메시지와 같은 장소(또는 암호화된 메시지가 저장되는 장소)에 저장하면 시스템은 안전하지 않습니다.복호화 키와 같은 토큰을 사용자 인증에 사용합니다(비대칭 암호화의 경우 토큰을 개인 키 패스 프레이즈로 사용합니다).적어도 일시적으로 복호화가 이루어지는 서버에 토큰을 저장해야 하므로 검색 불가능한 세션 스토리지 기판을 사용하거나 토큰을 메모리에 저장하고 온디맨드 방식으로 메시지의 복호화를 실행하는 세션과 관련된 데몬에 직접 토큰을 전달하는 것을 고려할 수 있습니다.

저는 이런 시도를 해봤지만, 저는 암호학자가 아니며 PHP나 프로그래밍 언어에 대한 깊은 지식을 가지고 있지 않습니다.그냥 생각일 뿐이야.

생각은 (장소를) 쉽게 예측할 수 없는 파일이나 데이터베이스에 를 저장(또는 수동으로 입력)하는 것입니다(물론 언젠가는 어떤 것도 해독될 것입니다).이 개념은 복호화 시간을 연장하고 중요한 정보를 암호화하는 것입니다.

코드

$iv_size = mcrypt_get_iv_size(MCRYPT_BLOWFISH, MCRYPT_MODE_ECB);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
$key = "evenifyouaccessmydatabaseyouwillneverfindmyemail";
$text = "myemail@domain.com";
echo "Key: " . $key . "<br/>";
echo "Text: " . $text . "<br/>";
echo "MD5: " . md5($text) . "<br/>";
echo "SHA-1: " . sha1($text) . "<br/>";

$crypttext = mcrypt_encrypt(MCRYPT_BLOWFISH, $key, $text, MCRYPT_MODE_ECB, $iv);
echo "Encrypted Data: " . $crypttext . "<br>";

$base64 = base64_encode($crypttext);
echo "Encoded Data: " . $base64 . "<br/>";
$decode =  base64_decode($base64);

$decryptdata = mcrypt_decrypt(MCRYPT_BLOWFISH, $key, $crypttext, MCRYPT_MODE_ECB, $iv);

echo "Decoded Data: " . ereg_replace("?", null,  $decryptdata);
// Even if I add '?' to the sting to the text it works. I don't know why.

이것은 단지 컨셉일 뿐이므로 주의해 주십시오.이 코드를 개선해 주시면 대단히 감사하겠습니다.

password_hashpassword_verify 사용

<?php
/**
 * In this case, we want to increase the default cost for BCRYPT to 12.
 * Note that we also switched to BCRYPT, which will always be 60 characters.
 */
$options = [
    'cost' => 12,
];
echo password_hash("rasmuslerdorf", PASSWORD_BCRYPT, $options)."\n";
?>

복호화 방법:

<?php
// See the password_hash() example to see where this came from.
$hash = '$2y$07$BCryptRequires22Chrcte/VlQH0piJtjXl.0t1XkA8pw9dMXTpOq';

if (password_verify('rasmuslerdorf', $hash)) {
    echo 'Password is valid!';
} else {
    echo 'Invalid password.';
}
?>

언급URL : https://stackoverflow.com/questions/5089841/two-way-encryption-i-need-to-store-passwords-that-can-be-retrieved

반응형