• PHP手册-函数参考-加密扩展


    一、Crack、CSPRNG、Hash、Mcrypt、Mhash、OpenSSL、密码散列算法的对比
     
    Crack
    CSPRNG
    Hash
    Mcrypt
    Mhash
    OpenSSL
    密码散列算法
    简介
    本扩展使用CrackLib库来测试密码的强度。密码的强度是通过检查密码的长度、大小写,对照指定的CrackLib字典来检查的(原文:The 'strength' of a password is tested by that checks length, use of upper and lower case and checked against the specified CrackLib dictionary.
    CSPRNG是The cryptographically secure pseudo-random number generator的缩写,即伪随机数生成器。该API提供一种简单、可靠的方法,生成加密强的随机整数和用于加密上下文的字节(原文:generate crypto-strong random integers and bytes for use within cryptographic contexts.)
    (哈希)信息摘要引擎。允许使用各种哈希算法直接或增量处理任意长度的信息。
    本扩展是 mcrypt库的接口,提供了对多种块算法的支持, 包括:DES,TripleDES,Blowfish (默认), 3-WAY,SAFER-SK64,SAFER-SK128,TWOFISH,TEA,RC2 以及 GOST,并且支持 CBC,OFB,CFB 和 ECB 密码模式。 甚至,它还支持诸如 RC6 和 IDEA 这两种“非免费”的算法。 默认情况下,CFB/OFB 是 8 比特的。
    本扩展是 Mhash库的接口,提供了对多种块算法的支持,包括MD5, SHA1, GOST等等。mhash可以用来创建校验和、消息摘要、消息认证码等。
    OpenSSL 函数用来产生、验证签名,以及密封(加密)启封(解密)数据。
    密码散列算法 API 提供了简单易用的 crypt() 包装, 以一种简洁易用安全的方式创建和管理密码。
    安装
    需安装此 PECL 扩展。
    构建此扩展不需要其他扩展。
    使用这些函数不需要安装,它们是 PHP 核心的一部分。
    哈希扩展是内置的,不需要外部库, 默认是启用的,可以通过 --disable-hash 参数来禁用此扩展。
    需要使用mcrypt库,使用 --with-mcrypt[=DIR] 参数来编译 PHP 以启用本扩展。 DIR 是 mcrypt 的安装路径。 请确保编译 libmcrypt 的时候使用了 --disable-posix-threads 选项。
    使用 --with-mhash[=DIR] 参数来编译 PHP 以启用本扩展。 DIR 是 mcrypt 的安装路径。
    使用 --with-openssl[=DIR] 参数来编译 PHP 以启用本扩展。 DIR 是 mcrypt 的安装路径。
    构建此扩展不需要其他扩展。
    使用这些函数不需要安装,它们是 PHP 核心的一部分。
    配置
    此扩展没有在 php.ini 中定义配置指令。
    此扩展没有在 php.ini 中定义配置指令。
    此扩展没有在 php.ini 中定义配置指令。
    mcrypt.algorithms_dir - 包含算法的目录。
    mcrypt.modes_dir - 包含模式的目录。
    两个函数的行为受 php.ini 中的设置影响。二者均默认是libmcrypt的编译目录,通常是/usr/local/lib/libmcrypt。
    此扩展没有在 php.ini 中定义配置指令。
    openssl.cafile - 本地文件系统上认证授权文件的位置,应该与上下文选项verify_peer来进行远程节点的身份验证原文:Location of Certificate Authority file on local filesystem which should be used with the verify_peer context option to authenticate the identity of the remote peer.)。
    openssl.cafile  - 如果没有指定cafile或者没有找到证书,目录就会指向一个适合证书的capath。capath必须是一个正确的散列证书目录。(原文:If cafile is not specified or if the certificate is not found there, the directory pointed to by capath is searched for a suitable certificate. capath must be a correctly hashed certificate directory.)。
    此扩展没有在 php.ini 中定义配置指令。
    预定义常量
    HASH_HMAC - hash_init() 中的可选标志。表示 HMAC digest-keying 算法应被用于当前哈希上下文环境。
    MCRYPT_MODE_ECB
    MCRYPT_MODE_CBC
    MCRYPT_MODE_CFB
    MCRYPT_MODE_OFB
    MCRYPT_MODE_NOFB
    MCRYPT_MODE_STREAM
    常量仅在此扩展编译入PHP或在运行时动态载入时可用。
    MHASH_CRC32
    MHASH_MD5
    MHASH_SHA1
    PASSWORD_BCRYPT - 使用此常量生成结果的长度将在未来有变化。因此,数据库里储存结果的列可超过60个字符(最好是255个字符)。
    PASSWORD_DEFAULT - 使用此常量生成的结果是 60 个字符的字符串
     
    二、Crack
    Pecl安装失败,从https://pecl.php.net/package/crack下载压缩包后,解压、编译、安装也失败了。
    得找个时间专门研究编译安装扩展了。。。
     
    三、CSPRNG——只能在PHP7下使用。
    ① 可以用来生成token或盐(salt)
    random_bytes — 生成密码安全的伪随机字节。
    语法:string random_bytes ( int $length ),生成适合加密使用的加密随机字节的任意长度字符串,如生成盐、密钥或初始化向量。
    bin2hex — 把包含数据的二进制字符串转换为十六进制值。
    语法:string bin2hex( string $str )
    <?php
    $bytes = random_bytes(5);
    var_dump(bin2hex($bytes));  // 输出:string(10) "c8c9ceba82"
    function RandomToken($length = 32){
        if(!isset($length) || intval($length) <= 8 ){
            $length = 32;
        }
        if (function_exists('random_bytes')) {
            return bin2hex(random_bytes($length));
        }
        if (function_exists('mcrypt_create_iv')) {
            return bin2hex(mcrypt_create_iv($length, MCRYPT_DEV_URANDOM));
        }
        if (function_exists('openssl_random_pseudo_bytes')) {
            return bin2hex(openssl_random_pseudo_bytes($length));
        }
    }
    function Salt(){
        return substr(strtr(base64_encode(hex2bin(RandomToken(32))), '+', '.'), 0, 44);
    }
    echo (RandomToken());   // 输出:d5152e915a1e909ca79aa78ae70d978460caf60a2569559161862132eaeb2b3c
    echo Salt();    // 输出:ko.el59enM/13S8pHD9bRuUyLR4IzIJmNN8fG7gR/Ic=
     
    ② 生成伪随机数
    random_int— 生成密码安全的伪随机数。
    语法:int random_int( int $min , int $max ),返回一个最小值~最大值之间的加密的安全随机整数。
    <?php
    var_dump(random_int(100, 999));     // 输出:int(961)
    var_dump(random_int(-1000, 0));     // 输出:int(-632) 
    注:如果在PHP7以下的版本中使用,可参见在PHP 5.6和5.5中的random_bytes(),也就是使用random_compat,链接附上:https://github.com/paragonie/random_compat
     
    四、Hash
    ① hash_algos — 返回已注册的哈希算法列表。
    <?php
    $algos = hash_algos();
    print_r($algos);
    // 输出:
    Array ( 
      [0] => md2 [1] => md4 [2] => md5 [3] => sha1 [4] => sha224 [5] => sha256 [6] => sha384 [7] => sha512/224 [8] => sha512/256 [9] => sha512   [10] => sha3-224 [11] => sha3-256 [12] => sha3-384 [13] => sha3-512 [14] => ripemd128 [15] => ripemd160 [16] => ripemd256 [17] => ripemd320 [18] => whirlpool [19] => tiger128,3   [20] => tiger160,3 [21] => tiger192,3 [22] => tiger128,4 [23] => tiger160,4 [24] => tiger192,4 [25] => snefru [26] => snefru256 [27] => gost [28] => gost-crypto [29] => adler32
      [30] => crc32 [31] => crc32b [32] => fnv132 [33] => fnv1a32 [34] => fnv164 [35] => fnv1a64 [36] => joaat [37] => haval128,3 [38] => haval160,3 [39] => haval192,3   [40] => haval224,3 [41] => haval256,3 [42] => haval128,4 [43] => haval160,4 [44] => haval192,4 [45] => haval224,4 [46] => haval256,4 [47] => haval128,5 [48] => haval160,5 [49] => haval192,5   [50] => haval224,5 [51] => haval256,5
    )
     
    ② hash_hmac — 使用 HMAC 方法生成带有密钥的哈希值。
    语法:string hash_hmac ( string $algo , string $data , string $key [, bool $raw_output = false ] ),其中:
    algo - 要使用的哈希算法名称,例如:"md5","sha256","haval160,4" 等。可通过hash_algos()函数获取;
    data - 要进行哈希运算的消息;
    key - 使用HMAC生成信息摘要时所使用的密钥;
    raw_output - 设置为TRUE输出原始二进制数据,设置为FALSE输出小写 16 进制字符串。
    <?php
    $data = 'Today is Thursday.';
    echo hash('md5', $data); // md5 哈希
    // 不同的密钥生成的哈希值也不同
    $key1 = 'md5-key';
    echo hash_hmac('md5', $data, $key1);    
    $key2 = 'secret';
    echo hash_hmac('md5', $data, $key2);
    // 输出:
    85e2a9ff0b743fb86888d3be904b512c
    be1f48e3c5c4cb05b71f7eb0c7bd9286
    80d6b50d68db6ac250b8688cda712a4a
     
    ③ 使用给定文件的内容生成哈希值
    hash_file — 使用给定文件的内容生成哈希值。
    语法:string hash_file ( string $algo , string $filename [, bool $raw_output = false ] ),其中:
    algo - 要使用的哈希算法名称,例如:"md5","sha256","haval160,4" 等。可通过hash_algos()函数获取;
    filename - 要进行哈希运算的文件路径;
    raw_output - 设置为TRUE输出原始二进制数据, 设置为FALSE输出小写 16 进制字符串;
    hash_hmac_file — 使用 HMAC 方法和给定文件的内容生成带密钥的哈希值。
    语法:string hash_hmac_file( string $algo , string $filename , string $key [, bool $raw_output = false ] ),其中:
    key - 使用HMAC生成信息摘要时所使用的密钥。
    <?php
    $file = 'hmac.txt’;
    $key = 'md5-key';
    echo hash_file('md5', $file);
    echo hash_hmac_file('md5', $file, $key);
    // 输出:
    hamc.txt内容为abcdefghijklmnopqrstuvwxyz
    c3fcd3d76192e4007dfb496cca67e13b
    c30c586135ef70cdad8a8db52912eadc
     
    ④ 封装成函数
    hash && hash_hmac
    /**
    * @param $algo hash算法
    * @param $data string|array 字符串或者字符串数组
    * @param $options 进行哈希运算的可选设置,目前仅支持:HASH_HMAC。当指定此选项时,必须指定 key 参数
    * @param $key 当 options 参数为 HASH_HMAC 时,使用此参数传入进行 HMAC 哈希运算时的共享密钥
    */
    function get_hash_data($algo, $data, $options = 0, $key = NULL) {
        $ctx = hash_init($algo, $options, $key);
        if(is_string($data)) {
            hash_update($ctx, $data);
        } else if(is_array($data)) {
            foreach($data as $d) {
                hash_update($ctx, $d); //填充数据, 可以多次调用, 和拼接字符串效果一样
            }
        }
        return hash_final($ctx); //输出最后的数据
    }
    $data = "Hello, world!";
    $key = "md5-key";
    echo get_hash_data('md5', $data);
    echo hash('md5', $data);    // 与直接使用hash函数的结果一样
    echo get_hash_data('md5', $data, HASH_HMAC, $key);
    echo hash_hmac('md5', $data, $key);    // 与直接使用hash_hmac函数的结果一样
    // 输出:
    6cd3556deb0da54bca060b4c39479839
    6cd3556deb0da54bca060b4c39479839
    1954a2a2e7f7d4e67b8115487238b7ac
    1954a2a2e7f7d4e67b8115487238b7ac
     
    hash_file && hash_hmac_file
    /**
    * @param $algo hash算法
    * @param $filename 要进行哈希运算的文件路径
    * @param $options 进行哈希运算的可选设置,目前仅支持:HASH_HMAC。当指定此选项时,必须指定 key 参数
    * @param $key 当 options 参数为 HASH_HMAC 时,使用此参数传入进行 HMAC 哈希运算时的共享密钥
    */
    function get_hash_data_by_file($algo, $filename, $options = 0, $key = NULL) {
        $ctx = hash_init($algo, $options, $key);
        hash_update_file($ctx, $filename);
        return hash_final($ctx);
    }
    $file = 'hmac.txt';
    $key = 'md5-key';
    echo get_hash_data_by_file('md5', $file);
    echo hash_file('md5', $file);    // 与直接使用hash_file函数的结果一样
    echo get_hash_data_by_file('md5', $file, HASH_HMAC, $key);
    echo hash_hmac_file('md5', $file, $key);    // 与直接使用hash_hmac_file函数的结果一样
    // 输出:
    c3fcd3d76192e4007dfb496cca67e13b
    c3fcd3d76192e4007dfb496cca67e13b
    c30c586135ef70cdad8a8db52912eadc
    c30c586135ef70cdad8a8db52912eadc
     
    五、Mcrypt
    Mcrypt库支持20多种加密算法和8种加密模式,可以通过函数mcrypt_list_algorithms()和mcrypt_list_modes()来显示加密算法和模式。
    $algos = mcrypt_list_algorithms() ;
    $algo_modes = mcrypt_list_modes() ;
    print_r($algos);
    print_r($algo_modes);
    // 输出:
    Array ( 
        [0] => cast-128 [1] => gost [2] => rijndael-128 [3] => twofish [4] => arcfour [5] => cast-256 [6] => loki97 [7] => rijndael-192 [8] => saferplus [9] => wake 
        [10] => blowfish-compat [11] => des [12] => rijndael-256 [13] => serpent [14] => xtea [15] => blowfish [16] => enigma [17] => rc2 [18] => tripledes 
    )
    Array ( [0] => cbc [1] => cfb [2] => ctr [3] => ecb [4] => ncfb [5] => nofb [6] => ofb [7] => stream )

    这些算法和模式在实际应用中以常量表示,需要加上前缀MCRYPT_和MCRYPT_MODE_,如:MCRYPT_CAST-128和MCRYPT_MODE_CBC。

    mcrypt_encrypt— 使用给定参数加密明文。
    语法:string mcrypt_encrypt( string $cipher , string $key , string $data , string $mode [, string $iv ] ),其中:
    cipher - MCRYPT_ciphername 常量中的一个,或者是字符串值的算法名称;
    key - 加密密钥。 如果密钥长度不是该算法所能够支持的有效长度,则函数将会发出警告并返回 FALSE;
    data - 使用给定的 cipher 和 mode 加密的数据。 如果数据长度不是 n*分组大小,则在其后使用 '' 补齐。返回的密文长度可能比 data 更大;
    mode - MCRYPT_MODE_modename 常量中的一个,或以下字符串中的一个:"ecb","cbc","cfb","ofb","nofb" 和 “stream”;
    iv - 非NULL的初始化向量。
    <?php
    header("Content-Type:text/html; charset=utf-8");
    $str = "今天是星期五";                            //加密文本
    $key = "12345678";                              //密钥,需8bytes
    $cipher = MCRYPT_DES;                           //密码类型
    $modes = MCRYPT_MODE_ECB;                       //密码模式
    $iv = mcrypt_create_iv(mcrypt_get_iv_size($cipher,$modes),MCRYPT_RAND); //初始化向量
    echo "加密前:".$str."<p>";
    $str_encrypt = mcrypt_encrypt($cipher,$key,$str,$modes,$iv);         //加密函数
    echo "加密后:".$str_encrypt."<p>";
    $str_decrypt =mcrypt_decrypt($cipher,$key,$str_encrypt,$modes,$iv);  //解密函数
    echo "还原:".$str_decrypt."<p>";
    
    // 输出:
    加密前:今天是星期五
    加密后:�^�i��P�-�=����!��I�����
    还原:今天是星期五 
     
    六、Mhash
    mhash支持md5,sha1,crc32等多种散列算法,可以使用mhash_count()和mhash_get_hash_name()输出支持的算法名称。
    $num = mhash_count();          //函数返回最大的hash id
    echo "Mhash库支持的算法有:";
    for($i = 0; $i <= $num; $i++){
        echo '<br>';
        echo $i."=>".mhash_get_hash_name($i);    //输出每一个hash id 的名称
    }
    如果在实际应用中使用上面的常量,需要在算法名称前面加上 MHASH_作为前缀,比如 CRC32 表示为 MHASH_CRC32。
    应用:使用mhash_keygen_s2k()函数生成一个校验码
    <?php
    header("Content-Type:text/html; charset=utf-8");
    $str = "abcd";
    $hash = 2 ;
    $password = "1234";
    $salt = "1234";
    $key = mhash_keygen_s2k(1, $password, $salt,10);  //生成key 值
    $str_mhash =bin2hex(mhash($hash,$str,$key));  //使用$key值、$hash值对字符串$str加密
    echo "校验码是:" . $str_mhash;
    // 输出:
    校验码是:503672248af07cdfbc2d645f7835935e1722630e
     
    七、OpenSSL
    1、对称加密相关
    openssl_encrypt — 以指定的方式和 key 加密数据,返回原始或 base64 编码后的字符串。解密为openssl_decrypt。
    语法:string openssl_encrypt( string $data , string $method , string $key ),其中:
    data - 数据;
    method - 密码学方式,可以使用openssl_get_cipher_methods()获取有效密码方式列表;
    key - 密钥;
    options - 以下标记的按位或: OPENSSL_RAW_DATA 、 OPENSSL_ZERO_PADDING;
    iv - 非NULL的初始化向量。
    <?php
    $string
    = 'Hello, world'; $method = 'aes-128-cbc'; $pass = '12345678'; $iv = '1234567812345678'; // 16 bytes // 加密 $res = openssl_encrypt($string, $method, $pass, 0, $iv); print_r($res); // 解密 print_r(openssl_decrypt($res, $method, $pass, 0, $iv));
     
    2、非对称加密相关
    ① 从证书导出密钥
    openssl_get_publickey();openssl_pkey_get_public();      // 从证书导出公匙
    openssl_get_privatekey();openssl_pkey_get_private();    // 从证书导出私匙
    它们都需要传入证书文件(一般是.pem文件)。
    ② 使用密钥加密
    openssl_public_encrypt();   // 使用公匙加密
    语法:openssl_public_encrypt(string $data , string &$crypted , mixed $key [, int $padding = OPENSSL\_PKCS1\_PADDING ] ),其中:
    $data - 要加密的数据;
    $crypted - 一个引用变量,加密后的数据会被放入这个变量中;
    $key - 要传入的公匙数据;
    $padding - 由于被加密数据分组时,有可能不会正好为加密位数bit的整数倍,所以需要$padding(填充补齐),$padding的可选项有 OPENSSL_PKCS1_PADDING, OPENSSL_NO_PADDING,分别为PKCS1填充,或不使用填充。
    与此方法相对的还有(传入参数一致):
    openssl_public_decrypt();   // 使用公匙解密
    openssl_private_encrypt();  // 使用私匙加密
    openssl_private_decrypt();  // 使用私匙解密
    ③ 签名和验签函数
    openssl_sign — 签名函数
    语法:bool openssl_sign ( string $data , string &$signature , mixed $priv_key_id [, mixed $signature_alg = OPENSSL_ALGO_SHA1 ] ),其中:
    $data - 要签名的数据;
    $signature - 签名结果的引用变量;
    $priv_key_id - 签名所使用的私匙;
    $signature_alg - 签名要使用的算法,其算法列表可以使用openssl_get_md_methods()得到。
    openssl_sign — 验签函数
    语法:int openssl_verify ( string $data , string $signature , mixed $pub_key_id [, mixed $signature_alg = OPENSSL_ALGO_SHA1 ] )
    与签名函数相对,只不过它要传入与私匙对应的公匙,其结果为签名验证结果,1为成功,0为失败,-1则表示错误。
    // 在终端执行下述两行命令生成密钥、公钥:
    // 密钥生成
    openssl genrsa -out rsa_private_key.pem 1024 
    // -out 指定生成的密钥的文件名
    // 1024 生成一个1024长度的密钥,密钥长度越长越安全,但加解密所耗时间亦变长。
    // 公钥生成
    openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem
    // -in filename:输入的RSA密钥文件,在此为上面生成的密钥 rsa_private_key.pem。
    // -pubout:设置此选项后,保存公钥值到输出文件中。
    // -out filename:输出文件,在此我们定义成rsa_public_key.pem
     
    <?php
    // 私钥文件的路径
    $private_path = 'rsa_private_key.pem';
    // 公钥文件的路径
    $public_path = 'rsa_public_key.pem';
    // 生成Resource类型的密钥,如果密钥文件内容被破坏,openssl_pkey_get_private函数返回false
    $private_key = openssl_pkey_get_private(file_get_contents($private_path));
    // 生成Resource类型的公钥,如果公钥文件内容被破坏,openssl_pkey_get_public函数返回false
    $public_key = openssl_pkey_get_public(file_get_contents($public_path));
     
    // 原数据
    $original_data = '我的帐号是:liulu,密码是:123456';
    // 加密以后的数据,用于在网路上传输
    $encrypt_data = '';
     
    echo '原数据为:', $original_data, PHP_EOL;
     
    /*用私钥加密*/
    if (openssl_private_encrypt($original_data, $encrypt_data, $private_key)) {
        // 加密后 可以base64_encode后方便在网址中传输 或者打印  否则打印为乱码
        echo '加密成功,base64_encode加密后数据为:', base64_encode($encrypt_data), PHP_EOL;
    } else {
        die('加密失败');
    }
     
    /*用公钥解密*/
    // 解密以后的数据
    $decrypt_data ='';
    if (openssl_public_decrypt($encrypt_data, $decrypt_data, $public_key)) {
        echo '解密成功,解密后数据为:', $decrypt_data, PHP_EOL;
    } else {
        die('解密成功');
    }
     
    // 输出:
    原数据为:我的帐号是:liulu,密码是:123456 
    加密成功,base64_encode加密后数据为:enIrL+MrxiE61JP1YUA0kIIusQc2VyGb+Vylj4NptA7n4mfMMKKqAxuAwligJQXsB/X+nmQ4hbSxlIJlLLDmAyLa4f5Ss0yLyAzl4bLhAEzFuHucwcJW5euO9+qNr+FsqSdRviqTRwDTmDRmDA1Nhap4bR14N1vebyc2inY8vT4= 解密成功,
    解密后数据为:我的帐号是:liulu,密码是:123456
     
    八、密码散列算法
    简单的md5加密很容易通过字典的方式进行破解,随便找个md5解密的网站就能获取原始密码,Password Hashing API就能很好地解决这个问题,它包含4个函数:password_get_info()、password_hash()、password_needs_rehash()、password_verify()。
    ① password_hash — 创建密码的哈希(hash)
    语法:string password_hash ( string $password , integer $algo [, array $options ] ),其中:
    password - 用户密码
    algo - 密码算法常量,仅PASSWORD_BCRYPT和PASSWORD_DEFAULT二者可选
    options - 一个包含有选项的关联数组。目前支持两个选项:salt,在散列密码时加的盐(干扰字符串)以及cost,用来指明算法递归的层数。省略后,将使用随机盐值与默认 cost。
    <?php
    /**
    * 使用password_hash()
    * 使用默认算法哈希密码
    * 当前是 BCRYPT,并会产生 60 个字符的结果。
    *
    * 请注意,随时间推移,默认算法可能会有变化,
    * 所以需要储存的空间能够超过 60 字(255字不错)
    */
    echo password_hash("rasmuslerdorf", PASSWORD_DEFAULT);
    echo "</br>";
    
    /**
    * 使用password_hash() 手动设置 cost
    * PASSWORD_BCRYPT算法为 BCRYPT 增加 cost 到 12。
    * 始终产生 60 个字符。
    */
    $options = [
        'cost' => 12,
    ];
    echo password_hash("rasmuslerdorf", PASSWORD_BCRYPT, $options);
    echo "</br>";
    
    /**
    * 使用password_hash() 手动设置盐值
    * 这里的盐值是随机产生的。
    * 永远都不要使用固定盐值,或者不是随机生成的盐值。
    *
    * 绝大多数情况下,可以让 password_hash generate 为你自动产生随机盐值
    */
    $options = [
        'cost' => 11,
        'salt' => mcrypt_create_iv(22, MCRYPT_DEV_URANDOM),
    ];
    echo password_hash("rasmuslerdorf", PASSWORD_BCRYPT, $options);
     
    // 输出:
    $2y$10$1nPMiGAcPK0mGP0WC67YYebG9toLW0eb9Qg.IYKCK5H9hWVacR2qi
    $2y$12$Dm0QoI9Owtfl2UFjkhF/Ru.XQLuNC7bwajfsgH..SDFJ4k0ViFF1u
    $2y$11$ZYpIjzZ/dd3SeZeqFYMolO7VElissnyaFAtmY.RKPLbcb3cPhwB7W
     
    ② password_verify — 验证密码是否和哈希匹配。
    语法:boolean password_verify( string $password , string $hash ),其中参数hash为使用password_hash()创建的散列值。
    <?php
    $hash = '$2y$11$ZYpIjzZ/dd3SeZeqFYMolO7VElissnyaFAtmY.RKPLbcb3cPhwB7W';
    if (password_verify('rasmuslerdorf', $hash)) {
        echo 'Password is valid!';
    } else {
        echo 'Invalid password.';
    }
    // 输出:
    Password is valid!
  • 相关阅读:
    ThinkPHP5如何修改默认跳转成功和失败页面
    layer:web弹出层解决方案
    js插件---video.js如何使用
    【Leetcode】Search a 2D Matrix
    tableView 短剪线离开15像素问题
    经Apache将tomcat转用80port这两个域名
    [Python 2.7] Hello World CGI HTTP Server
    《代码的第一行——Android》封面诞生
    MySQL汇总数据
    Windows移动开发(一)——登堂入室
  • 原文地址:https://www.cnblogs.com/sunshineliulu/p/7491659.html
Copyright © 2020-2023  润新知