php 函数三

一 对称加密

1.1 openssl

1.1.1 openssl_get_cipher_methods(bool $aliases = false)

获取可用的加密算法。包含可用加密算法的array。 请注意:在 OpenSSL 1.1.1 版本之前,返回加密算法的拼法大小写都有; 从 OpenSSL 1.1.1 开始,统一只返回小写的形式。

aliases 如果密码别名应该包含在返回的array中,则设置为 true.

openssl版本查询

php --re openssl | grep version
Extension [ <persistent> extension #4 openssl version 7.4.30 ] {
    $ciphers = openssl_get_cipher_methods();$ciphers1 = array_filter($ciphers,function ($value) {return str_starts_with($value, "aes") === TRUE;});var_dump($ciphers1);$ciphers_and_aliases = openssl_get_cipher_methods(true);$ciphers2 = array_filter($ciphers_and_aliases,function ($value) {return strpos($value, "bf") !== FALSE;});var_dump($ciphers2);

 测试结果

array(36) {[0]=>string(11) "aes-128-cbc"[1]=>string(21) "aes-128-cbc-hmac-sha1"[2]=>string(23) "aes-128-cbc-hmac-sha256"[3]=>string(11) "aes-128-ccm"[4]=>string(11) "aes-128-cfb"[5]=>string(12) "aes-128-cfb1"[6]=>string(12) "aes-128-cfb8"[7]=>string(11) "aes-128-ctr"[8]=>string(11) "aes-128-ecb"[9]=>string(11) "aes-128-gcm"[10]=>string(11) "aes-128-ocb"[11]=>string(11) "aes-128-ofb"[12]=>string(11) "aes-128-xts"[13]=>string(11) "aes-192-cbc"[14]=>string(11) "aes-192-ccm"[15]=>string(11) "aes-192-cfb"[16]=>string(12) "aes-192-cfb1"[17]=>string(12) "aes-192-cfb8"[18]=>string(11) "aes-192-ctr"[19]=>string(11) "aes-192-ecb"[20]=>string(11) "aes-192-gcm"[21]=>string(11) "aes-192-ocb"[22]=>string(11) "aes-192-ofb"[23]=>string(11) "aes-256-cbc"[24]=>string(21) "aes-256-cbc-hmac-sha1"[25]=>string(23) "aes-256-cbc-hmac-sha256"[26]=>string(11) "aes-256-ccm"[27]=>string(11) "aes-256-cfb"[28]=>string(12) "aes-256-cfb1"[29]=>string(12) "aes-256-cfb8"[30]=>string(11) "aes-256-ctr"[31]=>string(11) "aes-256-ecb"[32]=>string(11) "aes-256-gcm"[33]=>string(11) "aes-256-ocb"[34]=>string(11) "aes-256-ofb"[35]=>string(11) "aes-256-xts"
}
array(5) {[72]=>string(2) "bf"[73]=>string(6) "bf-cbc"[74]=>string(6) "bf-cfb"[75]=>string(6) "bf-ecb"[76]=>string(6) "bf-ofb"
}

1.1.2 openssl_cipher_iv_length(string $cipher_algo)

获取密码iv长度。成功返回true,失败返回false。

cipher_algo 加密方法,值范围在openssl_get_cipher_methods()之内。当密码方法未知时,抛出一个E_WARNING 级的错误。

1.1.3 openssl_random_pseudo_bytes(int $length, bool &$strong_result = null)

生成一个伪随机字节串,字节数由 length 参数指定。

length 所需字符串长度。

strong_result 是否使用强加密。

1.1.4 openssl_encrypt()

以指定的方式和 key 加密数据,返回原始或 base64 编码后的字符串。返回字符串或布尔值。

参数列表

  1. $data 待加密明文数据
  2. $cipher_algo 加密学方式。openssl_get_cipher_methods()中内容。
  3. $passphrase 口令。若 passphrase 比预期长度短,将静默用 NUL 填充; 若比预期长度更长,将静默截断。
  4. $options 值可为OPENSSL_RAW_DATAOPENSSL_ZERO_PADDING,根据标记按位或。options默认为0。
  5. $iv 非 NULL 的初始化向量。 默认为""。
  6. &$tag 使用 AEAD 密码模式(GCM 或 CCM)时传引用的验证标签。默认为NULL。
  7. $aad 附加的验证数据。 默认为""。
  8. $tag_length 验证 tag 的长度。GCM 模式时,它的范围是 4 到 16。默认16。

没查到OPENSSL_RAW_DATAOPENSSL_ZERO_PADDING对应信息,测试结果 OPENSSL_RAW_DATA=1,OPENSSL_ZERO_PADDING=2。

var_dump(OPENSSL_RAW_DATA, OPENSSL_ZERO_PADDING);#测试结果
int(1)
int(2)

1.1.5 openssl_decrypt()

采用原始或base64编码的字符串,并使用给定的方法和密钥对其进行解密。

参数中没有$tag_length,其余参数顺序和说明与openssl_encrypt()相同。

    $plaintext = "message to be encrypted";$aad = time();$passphrase = "lsswear" . $aad;$options = 0;$cipher = "aes-128-gcm";if (in_array($cipher, openssl_get_cipher_methods())) {$ivlen = openssl_cipher_iv_length($cipher);var_dump($ivlen);$iv = openssl_random_pseudo_bytes($ivlen, $strong_result);var_dump($iv, $strong_result);$ciphertext = openssl_encrypt($plaintext, $cipher, $passphrase, $options, $iv, $tag, $aad, 10);var_dump($ciphertext, $tag);$original_plaintext = openssl_decrypt($ciphertext, $cipher, $passphrase, $options, $iv, $tag, $aad);var_dump($original_plaintext);}

测试结果

string(12) "Rv}]"
bool(true)
string(32) "8YzjMXJ3bQBLEpEyPtS/Dgx4Y2tB8Ks="
string(10) "ϪL J"
string(23) "message to be encrypted"

1.2 base64

1.2.1 base64_encode(string $string)

使用 MIME base64 对数据进行编码。string为需加密的明文。返回字符串。

1.2.2 base64_decode(string $string, bool $strict = false)

对使用 MIME base64 编码的数据进行解码。

string 加密过的字符串

strict 为true 时,一旦输入的数据超出了 base64 字母表,将返回 false。 否则会静默丢弃无效的字符。

 $plaintext = "message to be encrypted €";$str = base64_encode($plaintext);var_dump($str);$str2 = base64_decode($str);var_dump($str2);#测试结果
string(36) "bWVzc2FnZSB0byBiZSBlbmNyeXB0ZWQg4oKs"
string(27) "message to be encrypted €"

1.3 url

1.3.1 urlencode(string $string)

编码 URL 字符串。返回字符串。

1.3.2 urldecode()

解码已编码的 URL 字符串。返回解码后的字符串。

1.4 html码转义

可以处理防止注入。

1.4.1 htmlentities()

将字符转换为 HTML 转义字符。返回编码后的字符。

参数列表

  1. $string 需转义字符。
  2. $flags int类型。掩码标记。用于设置如何处理引号、无效代码序列、使用文档的类型。默认是 ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401
  3. $encoding 字符串类型。定义转换字符时使用的编码。默认为default_charset配置选项的值。如果default_charset配置选项可能对给定的输入设置不正确,则强烈建议您为代码指定正确的值
  4. $double_encode 布尔值,默认true。为false时不会转换现有的 HTML 实体, 默认是全部转换。

flags 可用标记

常量名描述
ENT_COMPAT会转换双引号,不转换单引号。
ENT_QUOTES既转换双引号也转换单引号。
ENT_NOQUOTES单/双引号都不转换
ENT_IGNORE静默丢弃无效的代码单元序列,而不是返回空字符串。 不建议使用此标记, 因为它» 可能有安全影响。
ENT_SUBSTITUTE替换无效的代码单元序列为 Unicode 代替符(Replacement Character), U+FFFD (UTF-8) 或者 &#xFFFD; (其他),而不是返回空字符串。
ENT_DISALLOWED为文档的无效代码点替换为 Unicode 代替符(Replacement Character): U+FFFD (UTF-8),或 &#xFFFD;(其他),而不是把它们留在原处。 比如以下情况下就很有用:要保证 XML 文档嵌入额外内容时格式合法。
ENT_HTML401以 HTML 4.01 处理代码。
ENT_XML1以 XML 1 处理代码。
ENT_XHTML以 XHTML 处理代码。
ENT_HTML5以 HTML 5 处理代码。

encoding 字符集列表

字符集别名描述
ISO-8859-1ISO8859-1西欧,Latin-1
ISO-8859-5ISO8859-5Little used cyrillic charset (Latin/Cyrillic).
ISO-8859-15ISO8859-15西欧,Latin-9。增加欧元符号,法语和芬兰语字母在 Latin-1(ISO-8859-1) 中缺失。
UTF-8ASCII 兼容的多字节 8 位 Unicode。
cp866ibm866, 866DOS 特有的西里尔编码。本字符集在 4.3.2 版本中得到支持。
cp1251Windows-1251, win-1251, 1251Windows 特有的西里尔编码。本字符集在 4.3.2 版本中得到支持。
cp1252Windows-1252, 1252Windows 特有的西欧编码。
KOI8-Rkoi8-ru, koi8r俄语。本字符集在 4.3.2 版本中得到支持。
BIG5950繁体中文,主要用于中国台湾省。
GB2312936简体中文,中国国家标准字符集。
BIG5-HKSCS繁体中文,附带香港扩展的 Big5 字符集。
Shift_JISSJIS, 932日语
EUC-JPEUCJP日语
MacRomanMac OS 使用的字符串。
''空字符串激活从脚本编码(Zend多字节)、default_charset和当前语言环境(参见nl_langinfo()和setlocale())中按此顺序进行检测。不推荐。

1.4.2 html_entity_decode(string $string, int $flags = ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401, ?string $encoding = null)

HTML 转义字符解码。参数意义和htmlentities()相同。返回解码后的字符串

    $url = "https://mp.csdn.net/mp_blog/creation/editor/135825528";$str1 = urlencode($url);var_dump($str1);$str2 = urldecode($str1);var_dump($str2);$html = "<b>测试:<href src='" . $str1 . "'></b>";var_dump($html);$flags = ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML5;$encoding = "cp866";$hstr1 = htmlentities($html, $flags, $encoding, false);var_dump($hstr1);$hstr2 = html_entity_decode($hstr1, $flags, $encoding);var_dump($hstr2);$hstr3 = htmlentities($html, $flags, $encoding);var_dump($hstr3);

测试结果

string(67) "https%3A%2F%2Fmp.csdn.net%2Fmp_blog%2Fcreation%2Feditor%2F135825528"
string(53) "https://mp.csdn.net/mp_blog/creation/editor/135825528"
string(96) "<b>测试:<href src='https%3A%2F%2Fmp.csdn.net%2Fmp_blog%2Fcreation%2Feditor%2F135825528'></b>"
string(252) "&lt;b&gt;&tscy;&boxvL;&Lcy;&shcy;&pcy;&KHcy;&yacy;&boxUL;&HARDcy;&lt;href src&equals;&apos;https&percnt;3A&percnt;2F&percnt;2Fmp&period;csdn&period;net&percnt;2Fmp&lowbar;blog&percnt;2Fcreation&percnt;2Feditor&percnt;2F135825528&apos;&gt;&lt;&sol;b&gt;"
string(96) "<b>测试:<href src='https%3A%2F%2Fmp.csdn.net%2Fmp_blog%2Fcreation%2Feditor%2F135825528'></b>"
string(252) "&lt;b&gt;&tscy;&boxvL;&Lcy;&shcy;&pcy;&KHcy;&yacy;&boxUL;&HARDcy;&lt;href src&equals;&apos;https&percnt;3A&percnt;2F&percnt;2Fmp&period;csdn&period;net&percnt;2Fmp&lowbar;blog&percnt;2Fcreation&percnt;2Feditor&percnt;2F135825528&apos;&gt;&lt;&sol;b&gt;"

 经测试发现$double_encode的值对转义结果好像没有影响。

二 非对称加密

hash加密之后再写一篇文章。sha1已不再推荐使用。

2.1 openssl

openssl也有对如公钥私钥的使用。之后单写一篇文章。公钥、私钥、签名,实际使用流程可参考微信支付签名。

2.1.1 openssl_sign()

生成签名。成功时返回 true, 或者在失败时返回 false

参数列表

  1. $sign 待加密明文。
  2. &$signature 加密后的字符串。
  3. $private_key 用户私钥。可算类型OpenSSLAsymmetricKey|OpenSSLCertificate|array|string。
  4. $algorithm 算法。 可以传int值或字符串。int值在Signature Algorithms中。字符串为openssl_get_md_methods()返回数组中的值。

$algorithm 可用int值:

  • OPENSSL_ALGO_DSS1 php8可能不支持
  • OPENSSL_ALGO_SHA1=>1  openssl_sign() 和 openssl_verify() 函数使用的默认算法。
  • OPENSSL_ALGO_SHA224=>6
  • OPENSSL_ALGO_SHA256=>7
  • OPENSSL_ALGO_SHA384=>8
  • OPENSSL_ALGO_SHA512=>9
  • OPENSSL_ALGO_RMD160=>10
  • OPENSSL_ALGO_MD5=>2
  • OPENSSL_ALGO_MD4=>3
  • OPENSSL_ALGO_MD2 可能php8不支持

2.1.2 openssl_verify()

验证签名。如果签名正确返回 1,签名错误返回 0,错误时返回 -1 或 false

 参数列表

  1. $data 签名。
  2. &$signature 原始二进制字符串,通过 openssl_sign() 或类似的函数生成
  3. $public_key 用户公钥。可算类型OpenSSLAsymmetricKey|OpenSSLCertificate|array|string。
  4. $algorithm 算法。 可以传int值或字符串。int值在Signature Algorithms中。字符串为openssl_get_md_methods()返回数组中的值。

2.1.3 openssl_pkey_get_private()

获取私钥。成功时现在返回 OpenSSLAsymmetricKey 实例,失败时返回 false

参数列表:

  1. private_key 私钥文件路径或私钥字符串,pem格式。
  2. passphrase 如果指定的密钥已被加密了(受密码保护),可选参数 passphrase 是必须要的。默认null。

2.1.4 openssl_pkey_get_public($public_key)

从证书中解析公钥。成功时返回 OpenSSLAsymmetricKey 实例,错误时返回 false

$public_key为PEM 格式的公钥,可用字段类型OpenSSLAsymmetricKey|OpenSSLCertificate|array|string。

字符串:pem证书文件路径,或对应密钥。

对象:OpenSSLAsymmetricKey|OpenSSLCertificate实例。

2.1.5 openssl_pkey_new(?array $options = null)

必须安装有效的 openssl.cnf 以保证此函数正确运行,即系统又openssl扩展,则该函数可使用。

一般Linux系统里都有,windows需要自己安装。

linux下载地址:[ Downloads ] - /source/index.html

windows下载地址:Win32/Win64 OpenSSL Installer for Windows - Shining Light Productions

options参数列表

options类型等同于 openssl.conf描述
digest_algstringdefault_md摘要算法或签名哈希算法,通常是 openssl_get_md_methods() 之一。
x509_extensionsstringx509_extensions选择在创建 x509 证书时应该使用哪些扩展
req_extensionsstringreq_extensions创建 CSR 时,选择使用哪个扩展
private_key_bitsintdefault_bits指定应该使用多少位来生成私钥
private_key_typeintnone选择在创建 CSR 时应该使用哪些扩展。可选值有 OPENSSL_KEYTYPE_DSAOPENSSL_KEYTYPE_DHOPENSSL_KEYTYPE_RSAOPENSSL_KEYTYPE_EC。 默认值是 OPENSSL_KEYTYPE_RSA
encrypt_keyboolencrypt_key是否应该对导出的密钥(带有密码短语)进行加密?
encrypt_key_cipherintnonecipher constants 常量之一。
curve_namestringnoneopenssl_get_curve_names() 之一。
configstringN/A自定义 openssl.conf 文件的路径。

 ciopher常量:

  • OPENSSL_CIPHER_RC2_40=>0
  • OPENSSL_CIPHER_RC2_128=>1
  • OPENSSL_CIPHER_RC2_64=>2
  • OPENSSL_CIPHER_DES=>3
  • OPENSSL_CIPHER_3DES=>4
  • OPENSSL_CIPHER_AES_128_CBC=>5
  • OPENSSL_CIPHER_AES_192_CBC=>6
  • OPENSSL_CIPHER_AES_256_CBC=>7

2.1.6 openssl_get_curve_names()

获得ECC的可用曲线名称列表。有效曲线名称的 array, 或者在失败时返回 false

获取用于公钥/私钥操作的椭圆曲线密码(ECC)中可用曲线名称的列表。两个最广泛的标准化/支持的曲线是 prime256v1(NIST P-256)和 secp384r1(NIST P-384)。

2.1.6 openssl_pkey_export()

key 当作 PEM 编码字符串导出并且将之保存到output (通过引用传递的)中。成功时返回 true, 或者在失败时返回 false。必须有openssl扩展。

参数列表:

  1. $key pem证书。
  2. &$output 输出内容。
  3. $passphrase 保护密钥。
  4. $options 与openssl_pkey_new()的options 相同。

2.1.7 openssl_pkey_get_details(OpenSSLAsymmetricKey $key)

返回包含密钥详情的数组。成功时返回包含密钥详情的数组,失败时返回 false

$key 为openssl_pkey_new()产生的资源。

返回数组包括bits (位数)、 key(表示公钥的字符串)和 type(密钥类型)。

type包括 OPENSSL_KEYTYPE_RSAOPENSSL_KEYTYPE_DSAOPENSSL_KEYTYPE_DHOPENSSL_KEYTYPE_EC 或者是 -1。-1代表未知类型。

  • OPENSSL_KEYTYPE_RSA,一个额外的键名为 "rsa" 的数组,包含了以下密钥数据:
    Key说明
    "n"modulus
    "e"public exponent
    "d"private exponent
    "p"prime 1
    "q"prime 2
    "dmp1"exponent1, d mod (p-1)
    "dmq1"exponent2, d mod (q-1)
    "iqmp"coefficient, (inverse of q) mod p
  • OPENSSL_KEYTYPE_DSA, 一个额外的键为 "dsa" 的数组, 包含如下的密钥数据。
    Key说明
    "p"prime number (public)
    "q"160-bit subprime, q | p-1 (public)
    "g"generator of subgroup (public)
    "priv_key"private key x
    "pub_key"public key y = g^x
  • OPENSSL_KEYTYPE_DH, 一个额外的键为 "dh" 的数组,包含如下的密钥数据。
    Key说明
    "p"prime number (shared)
    "g"generator of Z_p (shared)
    "priv_key"private DH value x
    "pub_key"public DH value g^x
  • OPENSSL_KEYTYPE_EC,一个额外的键为 "ec" 的数组,包含如下的密钥数据。
    Key说明
    "curve_name"name of curve, see openssl_get_curve_names()
    "curve_oid"ASN1 Object identifier (OID) for EC curve.
    "x"x coordinate (public)
    "y"y coordinate (public)
    "d"private key
    $res = openssl_pkey_new();openssl_pkey_export($res, $private_key); //生成私钥$public_key_pem = openssl_pkey_get_details($res)['key'];$public_key = openssl_pkey_get_public($public_key_pem);//生成公钥$msg = "qweqwe";openssl_sign($msg, $sign, $private_key, OPENSSL_ALGO_SHA256);$result = openssl_verify($msg, $sign, $public_key, OPENSSL_ALGO_SHA256);var_dump($result);测试结果
int(1)

2.2 md5(string $string, bool $binary = false)

md5加密。以 32 字符的十六进制数形式返回散列值。

如果可选的 binary 被设置为 true,那么 md5 摘要将以 16 字符长度的原始二进制格式返回。

$str = "qwe";
$str1 = md5($str);
$str2 = md5($str, true);
var_dump($str1, $str2);#测试结果
string(32) "76d80224611fc919a5d54f0ff9fba446"
string(16) "v$aOF"

2.3 crypt(string $string, string $salt)

单向字符串散列。此函数(还)不能安全地适用于二进制对象!返回基于标准 UNIX DES 算法或替代算法的散列字符串。

php8之前$salt可选,php8之后必填。不设置$salt会创建弱散列,既设置$salt安全性更高。为了更好的安全性,请确保指定足够强度的盐值。

password_hash()是crypt() 的简单封装。password_verify()可使用crypt()加密的值。

散列类型由盐值参数触发。如果没有提供盐值,PHP 将自动生成一个 2 个字符(DES)或者 12 个字符(MD5)的盐值 ,这取决于 MD5 crypt() 的可用性。PHP 设置了名为 CRYPT_SALT_LENGTH 的常量,用来表示可用散列允许的最长有效盐值。

支持以下散列类型:

  • CRYPT_STD_DES - 基于标准 DES 算法的散列使用 "./0-9A-Za-z" 字符中的两个字符作为盐值。在盐值中使用非法的字符将导致 crypt() 失败。
  • CRYPT_EXT_DES - 扩展的基于 DES 算法的散列。“sale” 为 9 个字符的字符串,由 1 个下划线后面跟着4个字符循环次数和4个字符盐值组成。这些 4个字符字符串都编码为 24 字节,最低有效位在前。值 063 被编码为 ./0-9A-Za-z。在盐值中使用非法的字符将导致 crypt() 失败。
  • CRYPT_MD5 - MD5 散列使用一个以 $1$ 开始的 12 字符的字符串盐值。
  • CRYPT_BLOWFISH - Blowfish 散列使用如下盐值:“$2a$”、“$2x$” 或 “$2y$”,两位 cost 参数,“$” 以及 22 位由 “./0-9A-Za-z” 中的字符组合而成的字符串。在盐值中使用此范围之外的字符将导致 crypt() 返回一个空字符串。两位 cost 参数是循环次数以 2 为底的对数,它的范围是 04-31,超出这个范围将导致 crypt() 失败。 “$2x$” 可能很弱,“$2x$” 散列对其兼容并增强安全性。对于新的散列,应该使用“$2y$”。
  • CRYPT_SHA256 - SHA-256 算法使用一个以 $5$ 开头的 16 字符字符串盐值进行散列。如果盐值字符串以 “rounds=<N>$” 开头,N 的数字值将被用来指定散列循环的执行次数,这点很像 Blowfish 算法的 cost 参数。默认的循环次数是 5000,最小是 1000,最大是 999,999,999。超出这个范围的 N 将会被转换为最接近的值。
  • CRYPT_SHA512 - SHA-512 算法使用一个以 $6$ 开头的 16 字符字符串盐值进行散列。如果盐值字符串以 “rounds=<N>$” 开头,N 的数字值将被用来指定散列循环的执行次数,这点很像 Blowfish 算法的 cost 参数。默认的循环次数是 5000,最小是 1000,最大是 999,999,999。超出这个范围的 N 将会被转换为最接近的值。
    $str = "qwe";$salt = [];$salt[1] = "Ab";$salt[2] = "_0001qwea";$salt[3] = "$1$123456789";$salt[4] = "$2y$";$salt[5] = '$5$qweqweqwe1234';$salt[6] = 'rounds=200$qweqwe';$salt[7] = '$6$asdasdasd1234';$salt[8] = 'rounds=300$';foreach ($salt as $key => $value) {$str1 = crypt($str, $value);var_dump($value . "——————" . $str1);$result = password_verify($str, $str1);var_dump($result);}

 测试结果

string(33) "Ab——————Ab/ILIFe8a.Hs"
bool(true)
string(47) "_0001qwea——————_0001qweaWSalSujA21g"
bool(true)
string(64) "$1$123456789——————$1$12345678$cUfiadV.wKBZVZPHNWyu.1"
bool(true)
string(24) "$2y$——————*0"
bool(false)
string(94) "$5$qweqweqwe1234——————$5$qweqweqwe1234$gx1my2HVZe1zw03lEcrklQ30A2aeS5UdDhw1hRV5IC/"
bool(true)
string(48) "rounds=200$qweqwe——————roDektsuRs4PI"
bool(true)
string(137) "$6$asdasdasd1234——————$6$asdasdasd1234$P8w7i6FURNeU2yqsepHrNZtpS20HQkGqtIjR9tjSkBQPIBAuTUzpAId1kqJu9ohR3jfiZK28DsSndLzUaL4be1"
bool(true)
string(42) "rounds=300$——————roDektsuRs4PI"
bool(true)

1.4 password

1.4.1 password_hash(string $password, string|int|null $algo, array $options = [])

密码加密。返回字符串。

$algo 在散列密码时指示算法的密码算法常量

$options 一个包含有选项的关联数组。

每个算法常量使用的选项数组不同,参考PHP: 预定义常量 - Manual。

1.4.2 password_verify(string $password, string $hash)

密码验证。验证$password和散列值$hash是否相符。

password_hash()中以PASSWORD_BCRYPT为例。修改cost参数,好像是修改crypt()中 CRYPT_BLOWFISH中cost的值,必须是两位数字。

    $str = "qweasd";$options = ['cost' => "12",];$str1 = password_hash($str, PASSWORD_BCRYPT, $options);var_dump($str1);$result = password_verify($str, $str1);var_dump($result);#测试结果
string(60) "$2y$12$CaacB/2Q5U3mexNr9rB0yOxSDdlPTK758wQqIBl9vgTMsryeqCGyq"
bool(true)

三 字符集转换 iconv

需要安装扩展iconv。php -m 可以查询。

3.1 iconv_set_encoding(string $type,string $encoding)

为字符编码转换设定当前设置。

type 可以为input_encoding、output_encoding、internal_encoding。

encoding 字符集。

经过文档查询iconv.input_encoding、iconv.output_encoding、iconv.internal_encoding已自 PHP 5.6.0 起废弃。强烈建议不要使用本特性。

所以这个函数做好不要使用。

本地测试环境php8提示Deprecated信息。

3.2 iconv_get_encoding(string $type = "all")

获取 iconv 扩展的内部配置变量。

type值可以是all、input_encoding、output_encoding、internal_encoding。

$info = iconv_get_encoding();
var_dump($info);
$info = iconv_get_encoding("input_encoding");
var_dump($info);

测试结果

array(3) {["input_encoding"]=>string(5) "UTF-8"["output_encoding"]=>string(5) "UTF-8"["internal_encoding"]=>string(5) "UTF-8"
}
string(5) "UTF-8"

3.3 iconv_mime_encode(string $field_name, string $field_value, array $options = [])

field_name 字段名,field_value 字段值。返回字符串或布尔值。

options:

  • scheme 指定编码方式。B代表base64,Q引号可打印的编码方案。
  • input-charset 默认iconv.internal_encoding
  • output-charset 默认 iconv.internal_encoding
  • line-length 指定标题行的最大长度。以防产生的报头字段比该参数的值长。如果没有给出,长度将限制为76个字符。
  • line-break-chars 设置拆包字符。粘包处理用。

3.4 iconv_mime_decode(string $string, int $mode = 0, ?string $encoding = null)

解码一个MIME头字段。返回字符串或布尔值。

string 编码头

model 模式。可选值:ICONV_MIME_DECODE_STRICT、ICONV_MIME_DECODE_CONTINUE_ON_ERROR。

ICONV_MIME_DECODE_STRICT:值为1。传入的头字段将会完全一致的按照» RFC2047的标准定义被解码. 这个选项默认是禁用的,因为有很多零散的邮件用户代理商不遵守标准规范并且不生成正确的MIME头。

ICONV_MIME_DECODE_CONTINUE_ON_ERROR:值为2。忽略任何错误语法,并继续处理传入的头字段。

3.5 iconv_mime_decode_headers(string $headers, int $mode = 0, ?string $encoding = null)

一次性解码多个 MIME 头字段。返回数组或布尔值。

model 与iconv_mime_decode()中参数说明相同。

    $preferences = array("input-charset" => "ISO-8859-1","output-charset" => "UTF-8","line-length" => 76,"line-break-chars" => "\n",);$preferences["scheme"] = "Q";// This yields "Subject: =?UTF-8?Q?Pr=C3=BCfung=20Pr=C3=BCfung?="$str1 = iconv_mime_encode("Subject", "Prüfung Prüfung", $preferences);var_dump($str1);$preferences["scheme"] = "B";// This yields "Subject: =?UTF-8?B?UHLDvGZ1bmcgUHLDvGZ1bmc=?="$str2 = iconv_mime_encode("Subject", "Prüfung Prüfung", $preferences);var_dump($str2);$arr = iconv_mime_decode($str1, 1, "UTF-8");var_dump($arr);$arr = iconv_mime_decode($str2, 2, "ISO-8859-1");var_dump($arr);$headers = ['subject' => $str1,'date' => iconv_mime_encode("Date", date('Y-m-d'), $preferences),];$headers_str = join(PHP_EOL, $headers);$headers = iconv_mime_decode_headers($headers_str, 0, "ISO-8859-1");var_dump($headers);

 测试结果

string(60) "Subject: =?UTF-8?Q?Pr=C3=83=C2=BCfung=20Pr=C3=83=C2=BCfung?="
string(49) "Subject: =?UTF-8?B?UHLDg8K8ZnVuZyBQcsODwrxmdW5n?="
string(30) "Subject: Prüfung Prüfung"
string(26) "Subject: Prüfung Prüfung"
array(2) {["Subject"]=>string(17) "Prüfung Prüfung"["Date"]=>string(10) "2024-02-02"
}

3.6 iconv(string $from_encoding, string $to_encoding, string $string)

$string字符串,$from_encoding转变为$to_encoding编码。返回字符串或布尔值。

    $text = "test '€'.";var_dump($text);$text2 = iconv("UTF-8", "ISO-8859-1//IGNORE", $text);var_dump($text2);$text3 = iconv("UTF-8", "ISO-8859-1//TRANSLIT", $text);var_dump($text3);$test4 = iconv("ISO-8859-1", "UTF-8//TRANSLIT", $text);var_dump($test4);

测试结果

string(11) "test '€'."
string(8) "test ''."
string(11) "test 'EUR'."
string(14) "test 'â¬'."

3.7 iconv_strlen(string $string, ?string $encoding = null)

基于指定的字符集计算字符长度。

strlen()根据字节数。

mb_strlen(string $string, ?string $encoding = null)根据给定的编码返回的字符数。encoding省略或是 null,则使用内部字符编码。

    $text = "qwe 123 测试,( -&- )";$len = iconv_strlen($text, "ISO-8859-1");var_dump($len);$len = iconv_strlen($text, "UTF-8");var_dump($len);$len = iconv_strlen($text);var_dump($len);$len = strlen($text);var_dump($len);$len = mb_strlen($text);var_dump($len);

测试结果

int(28)
int(18)
int(18)
int(28)
int(18)

根据php 官方文档:PHP: iconv_strlen - Manual

其长度和指定编码有关,所以和strlen()长度不一定一样。但是和mb_strlen()相比,从测试结果上看效果一样。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/674455.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【机器学习】数据清洗之识别缺失点

&#x1f388;个人主页&#xff1a;甜美的江 &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;机器学习 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进步…

Linux笔记之expect和bash脚本监听输出并在匹配到指定字符串时发送中断信号

Linux笔记之expect和bash脚本监听输出并在匹配到指定字符串时发送中断信号 code review! 文章目录 Linux笔记之expect和bash脚本监听输出并在匹配到指定字符串时发送中断信号1.expect2.bash 1.expect 在Expect脚本中&#xff0c;你可以使用expect来监听程序输出&#xff0c;…

Github 2024-02-08 开源项目日报 Top9

根据Github Trendings的统计&#xff0c;今日(2024-02-08统计)共有9个项目上榜。根据开发语言中项目的数量&#xff0c;汇总情况如下&#xff1a; 开发语言项目数量Ruby项目1HTML项目1Python项目1Scala项目1PLpgSQL项目1Rust项目1NASL项目1C项目1TypeScript项目1非开发语言项目…

谷歌seo搜索引擎优化有什么思路?

正常做seo哪有那么多思路&#xff0c;其实就那么几种方法&#xff0c;无非就关键词&#xff0c;站内优化&#xff0c;外链&#xff0c;可以说万变不离其宗&#xff0c;但如果交给我们&#xff0c;你就可以实现其他的思路&#xff0c;或者说玩法 收录可以说是一个网站的基础&…

【Linux】vim的基本操作与配置(下)

Hello everybody!今天我们继续讲解vim的操作与配置&#xff0c;希望大家在看过这篇文章与上篇文章后都能够轻松上手vim! 1.补充 在上一篇文章中我们说过了&#xff0c;在底行模式下set nu可以显示行号。今天补充一条&#xff1a;set nonu可以取消行号。这两条命令大家看看就可…

10个常考的前端手写题,你全都会吗?(上)

前言 &#x1f4eb; 大家好&#xff0c;我是南木元元&#xff0c;热爱技术和分享&#xff0c;欢迎大家交流&#xff0c;一起学习进步&#xff01; &#x1f345; 个人主页&#xff1a;南木元元 今天来分享一下10个常见的JavaScript手写功能。 目录 1.实现new 2.call、apply、…

[office] excel表格怎么绘制股票的CCI指标- #媒体#学习方法#笔记

excel表格怎么绘制股票的CCI指标? excel表格怎么绘制股票的CCI指标&#xff1f;excel表格中想要绘制一个股票cci指标&#xff0c;该怎么绘制呢&#xff1f;下面我们就来看看详细的教程&#xff0c;需要的朋友可以参考下 CCI指标是一种在股票&#xff0c;贵金属&#xff0c;货…

《统计学习方法:李航》笔记 从原理到实现(基于python)-- 第6章 逻辑斯谛回归与最大熵模型(2)6.2 最大熵模型

文章目录 6.2 最大熵模型6.2.1 最大熵原理6.2.3 最大熵模型的学习6.2.4 极大似然估计 《统计学习方法&#xff1a;李航》笔记 从原理到实现&#xff08;基于python&#xff09;-- 第3章 k邻近邻法 《统计学习方法&#xff1a;李航》笔记 从原理到实现&#xff08;基于python&am…

Mysql报错:too many connections

1 问题原因 MySQL报错“too many connections”通常是由于数据库的最大连接数超过了MySQL配置的最大限制。有以下几个原因: (1)访问量过高:当MySQL服务器面对大量的并发请求时,已经建立的连接数可能会不足以处理所有的请求,从而导致连接池耗尽、连接被拒绝、出现“too …

VMware17上安装centos7.9成功后,进入linux命令行以后,运行没几分钟直接卡死,或者说非常卡

VMware17上安装centos7.9成功后&#xff0c;进入linux命令行以后&#xff0c;运行没几分钟直接卡死&#xff0c;或者说非常卡 解决方案&#xff1a;关闭windows的Hyper-V服务&#xff0c;重启虚拟机

Biu懂AI:Object Detection训练数据的Label格式

Bui~ 新系列博文将专注AI相关领域&#xff0c;想要学习高通蓝牙相关知识请查看之前的系列或关注大博主声波电波就看今朝 在CV&#xff08;computer vision&#xff09;中&#xff0c;Object detection是其中的一个核心任务&#xff0c;它可以在输入图像或视频中识别并框出目标。…

Rust 初体验2

变量类型 Rust 语言的变量数据类型&#xff0c;主要包括整型、浮点型、字符、布尔型、元组、数组、字符串、枚举、结构体和可变变量等。 fn main() { // 整型 let integer: i32 100; println!("整型: {}", integer); // 浮点型 let floating_point: f64 3.1…

15.2 Linux入门(❤❤❤❤)

15.2 Linux入门 1. Linux基础1.1 基础概念1. 操作系统2. Linux操作系统3. CentOS操作系统1.2 CentOS安装配置1. 运行要求2. 虚拟机与CentOS安装1.3 Linux目录结构1.4 Linux远程管理配置2. Linux高级操作2.1 命令:vim文本编辑器(❤❤)2.2 命令:常用文本工具(❤❤)1. echo命令<

【网页设计期末】茶文化网站

本文资源&#xff1a;https://download.csdn.net/download/weixin_47040861/88818886 1.题目要求 设计要求&#xff1a; &#xff08;1&#xff09;网站页面数量不少于4个&#xff0c;文件命名规范&#xff0c;网站结构要求层次清楚&#xff0c;目录结构清晰&#xff0c;代码…

使用ORM模型操作MySQL数据库:Python爬虫数据持久化实践

源码分享 https://docs.qq.com/sheet/DUHNQdlRUVUp5Vll2?tabBB08J2 在Python爬虫开发中&#xff0c;数据持久化是一个重要的步骤。通常&#xff0c;我们会将爬取的数据保存到数据库中。本篇博客将介绍如何使用对象关系映射&#xff08;ORM&#xff09;模型在Python中操作MySQ…

Redis的数据类型与示例演示

目录 一、KEY操作 1.1 相关命令 说明&#xff1a; 1.2示例演示 二、String类型 2.1 结构图 2.2 示例演示 三、List类型 3.1 结构图 3.2 相关命令 3.3 示例演示 四、SET类型 4.1 结构图 4.2 相关命令 4.3 示例演示 五、ZSET类型 5.1 结构图 5.2 相关命令 六、…

NumPy基础之花式索引

1 NumPy基础之花式索引 NumPy的花式索引(Fancy indexing)指ndarray数组使用整数数组进行索引。这的整数数组可以是python的列表等可迭代对象&#xff0c;也可以是NumPy数组。 花式索引&#xff0c;用整数数组的元素作为对应轴的索引&#xff0c;并且按数组元素顺序选取子集。…

负载均衡SLB

1. 什么是阿里云上的负载均衡SLB&#xff1f;它的主要功能是什么&#xff1f; 阿里云上的负载均衡SLB是一种流量分发服务&#xff0c;它的主要功能是扩展应用系统的吞吐能力和提升系统可用性。 负载均衡SLB&#xff08;Server Load Balancer&#xff09;在阿里云中是一个核心…

useEffect的4种使用情况

useeffect的用法是&#xff1a;useEffect就是指定一个副效应函数&#xff0c;组件每渲染一次&#xff0c;该函数就自动执行一次。组件首次在网页 DOM 加载后&#xff0c;副效应函数也会执行。 useEffect使用时有以下4种情况 1、不传递 useEffect不传递第二个参数会导致每次渲染…

【Spring连载】使用Spring Data访问Redis(十一)----Redis事务 Transactions

【Spring连载】使用Spring Data访问Redis&#xff08;十一&#xff09;----Redis事务 Transactions Transactional 支持 Redis通过multi, exec 和 discard命令为事务提供支持。RedisTemplate上提供了这些操作。但是&#xff0c;RedisTemplate不能保证使用相同的连接运行事务中的…