当前位置: 首页 > news >正文

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()相比,从测试结果上看效果一样。

相关文章:

php 函数三

一 对称加密 1.1 openssl 1.1.1 openssl_get_cipher_methods(bool $aliases false) 获取可用的加密算法。包含可用加密算法的array。 请注意&#xff1a;在 OpenSSL 1.1.1 版本之前&#xff0c;返回加密算法的拼法大小写都有&#xff1b; 从 OpenSSL 1.1.1 开始&#xff0c…...

Windows下配置多个账号的git ssh

生成密钥 已经有一个密钥的情况下&#xff0c;用下面的命令生成一个新密钥&#xff0c;注意为了防止原始密钥文件被覆盖&#xff0c;需要给一个新名字&#xff1a; ssh-keygen -t rsa -f C:\\Users\\xxx\\.ssh\\id_rsa_xxx -C "xxxemail.com"给GitHub配置SSH Key …...

【漏洞复现】电信网关配置管理系统SQL注入漏洞

Nx01 产品简介 电信网关配置管理系统是一个用于管理和配置电信网络中网关设备的软件系统。它可以帮助网络管理员实现对网关设备的远程监控、配置、升级和故障排除等功能&#xff0c;从而确保网络的正常运行和高效性能。 Nx02 漏洞描述 电信网关配置管理系统存在SQL注入漏洞,攻…...

2018年苏州大学837复试机试C/C++

2018年苏州大学复试机试 要求 要求用C/C编程&#xff1b;对程序中必要的地方进行注释。上机规则 请在电脑桌面上新建一个文件夹文件夹名为考试姓名&#xff08;中文&#xff09;&#xff1b;考试完毕后&#xff0c;将所编写的文件放在上述文件中。 第一题&#xff08;20分&…...

【Jenkins】pipeline基本使用

目录 一、pipeline 二、创建pipeline项目 1、安装pipeline插件 2、创建pipeline项目 三、pipeline语法 1、pipeline组成 2、agent&#xff1a;指定流水线的执行位置&#xff0c;流水线中每个阶段都必须在某个地方执行 3、stage&#xff1a;阶段&#xff0c;代表流水线的…...

Bytebase 签约 Vianova,助力欧洲城市交通智能平台中 Snowflake 和 PG 的变更自动化及版本控制

在数字化发展的浪潮中&#xff0c;自动化数据库变更管理成为提升产品上线效率、降低人为失误风险的关键工具&#xff0c;同时促进流程的一致性与标准化&#xff0c;确保合规性和变更的可追溯性。近日&#xff0c;数据库 DevOps 团队协同管理工具 Bytebase 签约欧洲交通数据管理…...

SpringBoot 事务管理Transactional 数据回滚 数据一致性

介绍 SpringBoot当中的事物他保证了一致性&#xff0c;要么全部一起成功&#xff08;提交&#xff09;&#xff0c;要么一起失败&#xff0c;失败&#xff08;回滚&#xff09;后数据会回到当初的样子&#xff0c;是一组操作的集合。 事物类型 开启事物提交事物回滚事物 案…...

vue使用pdf.js实现在线查看pdf文件

需求&#xff1a;有一个列表页&#xff0c;用户点击查看&#xff0c;弹层展示后台接口返回的pdf内容(不是文件、地址之类的&#xff0c;乱码的pdf铭文(二进制文件流)) 1、pdf.js安装 npm install --save vue-pdf2、正文代码 <template><div><el-table :data&q…...

java---查找算法(二分查找,插值查找,斐波那契[黄金分割查找] )-----详解 (ᕑᗢᓫ∗)˒

目录 一. 二分查找&#xff08;递归&#xff09;&#xff1a; 代码详解&#xff1a; 运行结果&#xff1a; 二分查找优化&#xff1a; 优化代码&#xff1a; 运行结果&#xff08;返回对应查找数字的下标集合&#xff09;&#xff1a; ​编辑 二分查找&#xff08;非递归…...

鸿蒙应用/元服务开发-窗口(Stage模型)设置悬浮窗

一、设置悬浮窗说明 悬浮窗可以在已有的任务基础上&#xff0c;创建一个始终在前台显示的窗口。即使创建悬浮窗的任务退至后台&#xff0c;悬浮窗仍然可以在前台显示。通常悬浮窗位于所有应用窗口之上&#xff1b;开发者可以创建悬浮窗&#xff0c;并对悬浮窗进行属性设置等操…...

springboot集成easypoi导出多sheet页

pom文件 <dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-base</artifactId><version>4.1.0</version> </dependency> 导出模板&#xff1a; 后端代码示例&#xff1a; /*** 导出加油卡进便利店大额审批列…...

自己动手打包element UI官方手册文档教程

经常用element ui朋友开发的比较郁闷&#xff0c;官方文档网基本上都是打不开的&#xff0c; 官方&#xff1a;https://element.eleme.io/ 一直打不开&#xff0c;分析下是里面用的cdn链接ssl证书无效。 就想着自己搭建一个element UI文档 自己搭建的&#xff1a; Element文档网…...

《计算机网络简易速速上手小册》第5章:无线网络和移动通信(2024 最新版)

5.1 WLAN的工作原理 - 揭秘无线局域网络的魔法 5.1.1 基础知识 无线局域网络&#xff08;WLAN&#xff09;允许设备通过无线方式连接到一个局部区域网络&#xff0c;主要基于IEEE 802.11标准&#xff0c;俗称Wi-Fi。WLAN的核心是无线路由器&#xff0c;它不仅充当着网络中各设…...

2024PMP考试新考纲-近年PMP真题练一练和很详细解析(3)

今天华研荟继续为您分享和解析PMP真题&#xff0c;一方面让大家感受实际的PMP考试和出题形式&#xff0c;另一方面是通过较详细的解题思路和知识讲解帮助大家最后一个多月有效备考&#xff0c;一次性3A通过2024年PMP考试。 2024年PMP考试新考纲-近年真题随机练一练 (注&#x…...

java SpringBoot2.7整合Elasticsearch(ES)7 进行文档增删查改

首先 我们在 ES中加一个 books 索引 且带有IK分词器的索引 首先 pom.xml导入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId> </dependency>applicatio…...

动态内存管理(2)

文章目录 4. 几个经典的笔试题4.1 题目14.2 题目24.3 题目34.4 题目4 5. C/C程序的内存开辟6. 动态通讯录7. 柔性数组7.1 柔性数组的特点7.2 柔性数组的使用7.3 柔性数组的优势 4. 几个经典的笔试题 4.1 题目1 #include <stdio.h> #include <stdlib.h> #include …...

使用 git 上传文件时,运行 命令 git pull origin 时未成功,出现报错信息

项目场景&#xff1a; 背景&#xff1a; 使用 git 上传文件时&#xff0c;运行 命令 git pull origin 时未成功&#xff0c;出现报错信息 问题描述 问题&#xff1a; $ git pull origin print --allow-unrelated-histories error: Pulling is not possible because you hav…...

Linux文件编译

目录 一、GCC编译 1.直接编译 2.分步编译 预处理&#xff1a; 编译&#xff1a; 汇编&#xff1a; 链接&#xff1a; 3.多文件编译 4.G 二、Make 1.概述 2.使用步骤 3.makefile创建规则 3.1一个基本规则 3.2两个常用函数 4.示例文件 三、GDB 示例&#xff1a;…...

homeword_day1

第一章 命名空间 一&#xff0e;选择题 1、编写C程序一般需经过的几个步骤依次是&#xff08; B &#xff09; A. 编辑、调试、编译、连接 B. 编辑、编译、连接、运行 C. 编译、调试、编辑、连接 D. 编译、编辑、连接、运行 2、所谓数据封装就是将一组数据和与这组数据…...

ChatGPT论文指南|ChatGPT论文写作过程中6个润色与查重提示词

论文完成初稿之后&#xff0c;一般情况下&#xff0c;宝子们还需要找专家给我们提出评审意见。找专家评审其实并不容易&#xff0c;即使对老师来说&#xff0c;找人评审论文也是一件苦活。我们这个时候可以通过文字提示让 ChatGPT充当我们的评审专家&#xff0c;为论文提出问题…...

在软件开发中正确使用MySQL日期时间类型的深度解析

在日常软件开发场景中&#xff0c;时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志&#xff0c;到供应链系统的物流节点时间戳&#xff0c;时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库&#xff0c;其日期时间类型的…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻

在如今就业市场竞争日益激烈的背景下&#xff0c;越来越多的求职者将目光投向了日本及中日双语岗位。但是&#xff0c;一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧&#xff1f;面对生疏的日语交流环境&#xff0c;即便提前恶补了…...

设计模式和设计原则回顾

设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

【WiFi帧结构】

文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成&#xff1a;MAC头部frame bodyFCS&#xff0c;其中MAC是固定格式的&#xff0c;frame body是可变长度。 MAC头部有frame control&#xff0c;duration&#xff0c;address1&#xff0c;address2&#xff0c;addre…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?

在建筑行业&#xff0c;项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升&#xff0c;传统的管理模式已经难以满足现代工程的需求。过去&#xff0c;许多企业依赖手工记录、口头沟通和分散的信息管理&#xff0c;导致效率低下、成本失控、风险频发。例如&#…...

基于Docker Compose部署Java微服务项目

一. 创建根项目 根项目&#xff08;父项目&#xff09;主要用于依赖管理 一些需要注意的点&#xff1a; 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件&#xff0c;否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

Android第十三次面试总结(四大 组件基础)

Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成&#xff0c;用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机&#xff1a; ​onCreate()​​ ​调用时机​&#xff1a;Activity 首次创建时调用。​…...

Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?

Redis 的发布订阅&#xff08;Pub/Sub&#xff09;模式与专业的 MQ&#xff08;Message Queue&#xff09;如 Kafka、RabbitMQ 进行比较&#xff0c;核心的权衡点在于&#xff1a;简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...

day36-多路IO复用

一、基本概念 &#xff08;服务器多客户端模型&#xff09; 定义&#xff1a;单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力 作用&#xff1a;应用程序通常需要处理来自多条事件流中的事件&#xff0c;比如我现在用的电脑&#xff0c;需要同时处理键盘鼠标…...