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 编码后的字符串。返回字符串或布尔值。
参数列表
- $data 待加密明文数据
- $
cipher_algo 加密学方式。
openssl_get_cipher_methods()中内容。 - $
passphrase 口令。
若 passphrase 比预期长度短,将静默用NUL
填充; 若比预期长度更长,将静默截断。 - $
options 值可为OPENSSL_RAW_DATA
、OPENSSL_ZERO_PADDING
,根据标记按位或。options默认为0。
- $iv 非 NULL 的初始化向量。 默认为""。
- &$tag 使用 AEAD 密码模式(GCM 或 CCM)时传引用的验证标签。默认为NULL。
- $aad 附加的验证数据。 默认为""。
- $tag_length 验证
tag
的长度。GCM 模式时,它的范围是 4 到 16。默认16。
没查到OPENSSL_RAW_DATA
、 OPENSSL_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 转义字符。返回编码后的字符。
参数列表
$string 需转义字符。
$flags
int类型。掩码标记。用于设置如何处理引号、无效代码序列、使用文档的类型。默认是ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401
。$encoding
字符串类型。定义转换字符时使用的编码。默认为default_charset配置选项的值。如果default_charset配置选项可能对给定的输入设置不正确,则强烈建议您为代码指定正确的值$double_encode
布尔值,默认true。为false时不会转换现有的 HTML 实体, 默认是全部转换。
flags 可用标记
常量名 | 描述 |
---|---|
ENT_COMPAT | 会转换双引号,不转换单引号。 |
ENT_QUOTES | 既转换双引号也转换单引号。 |
ENT_NOQUOTES | 单/双引号都不转换 |
ENT_IGNORE | 静默丢弃无效的代码单元序列,而不是返回空字符串。 不建议使用此标记, 因为它» 可能有安全影响。 |
ENT_SUBSTITUTE | 替换无效的代码单元序列为 Unicode 代替符(Replacement Character), U+FFFD (UTF-8) 或者 � (其他),而不是返回空字符串。 |
ENT_DISALLOWED | 为文档的无效代码点替换为 Unicode 代替符(Replacement Character): U+FFFD (UTF-8),或 �(其他),而不是把它们留在原处。 比如以下情况下就很有用:要保证 XML 文档嵌入额外内容时格式合法。 |
ENT_HTML401 | 以 HTML 4.01 处理代码。 |
ENT_XML1 | 以 XML 1 处理代码。 |
ENT_XHTML | 以 XHTML 处理代码。 |
ENT_HTML5 | 以 HTML 5 处理代码。 |
encoding
字符集列表
字符集 | 别名 | 描述 |
---|---|---|
ISO-8859-1 | ISO8859-1 | 西欧,Latin-1 |
ISO-8859-5 | ISO8859-5 | Little used cyrillic charset (Latin/Cyrillic). |
ISO-8859-15 | ISO8859-15 | 西欧,Latin-9。增加欧元符号,法语和芬兰语字母在 Latin-1(ISO-8859-1) 中缺失。 |
UTF-8 | ASCII 兼容的多字节 8 位 Unicode。 | |
cp866 | ibm866, 866 | DOS 特有的西里尔编码。本字符集在 4.3.2 版本中得到支持。 |
cp1251 | Windows-1251, win-1251, 1251 | Windows 特有的西里尔编码。本字符集在 4.3.2 版本中得到支持。 |
cp1252 | Windows-1252, 1252 | Windows 特有的西欧编码。 |
KOI8-R | koi8-ru, koi8r | 俄语。本字符集在 4.3.2 版本中得到支持。 |
BIG5 | 950 | 繁体中文,主要用于中国台湾省。 |
GB2312 | 936 | 简体中文,中国国家标准字符集。 |
BIG5-HKSCS | 繁体中文,附带香港扩展的 Big5 字符集。 | |
Shift_JIS | SJIS, 932 | 日语 |
EUC-JP | EUCJP | 日语 |
MacRoman | Mac 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) "<b>ц╡ЛшпХя╝Ъ<href src='https%3A%2F%2Fmp.csdn.net%2Fmp_blog%2Fcreation%2Feditor%2F135825528'></b>"
string(96) "<b>测试:<href src='https%3A%2F%2Fmp.csdn.net%2Fmp_blog%2Fcreation%2Feditor%2F135825528'></b>"
string(252) "<b>ц╡ЛшпХя╝Ъ<href src='https%3A%2F%2Fmp.csdn.net%2Fmp_blog%2Fcreation%2Feditor%2F135825528'></b>"
经测试发现$double_encode的值对转义结果好像没有影响。
二 非对称加密
hash加密之后再写一篇文章。sha1已不再推荐使用。
2.1 openssl
openssl也有对如公钥私钥的使用。之后单写一篇文章。公钥、私钥、签名,实际使用流程可参考微信支付签名。
2.1.1 openssl_sign()
生成签名。成功时返回 true
, 或者在失败时返回 false
。
参数列表
- $sign 待加密明文。
&$signature 加密后的字符串。
$private_key 用户私钥
。可算类型OpenSSLAsymmetricKey|OpenSSLCertificate|array|string。$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
。
参数列表
- $data 签名。
&$signature
原始二进制字符串,通过 openssl_sign() 或类似的函数生成$public_key 用户公钥
。可算类型OpenSSLAsymmetricKey|OpenSSLCertificate|array|string。$algorithm 算法
。 可以传int值或字符串。int值在Signature Algorithms中。字符串为openssl_get_md_methods()返回数组中的值。
2.1.3 openssl_pkey_get_private()
获取私钥。成功时现在返回 OpenSSLAsymmetricKey 实例,失败时返回 false
。
参数列表:
private_key 私钥文件路径或私钥字符串,pem格式。
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_alg | string | default_md | 摘要算法或签名哈希算法,通常是 openssl_get_md_methods() 之一。 |
x509_extensions | string | x509_extensions | 选择在创建 x509 证书时应该使用哪些扩展 |
req_extensions | string | req_extensions | 创建 CSR 时,选择使用哪个扩展 |
private_key_bits | int | default_bits | 指定应该使用多少位来生成私钥 |
private_key_type | int | none | 选择在创建 CSR 时应该使用哪些扩展。可选值有 OPENSSL_KEYTYPE_DSA 、 OPENSSL_KEYTYPE_DH 、 OPENSSL_KEYTYPE_RSA 或 OPENSSL_KEYTYPE_EC 。 默认值是 OPENSSL_KEYTYPE_RSA 。 |
encrypt_key | bool | encrypt_key | 是否应该对导出的密钥(带有密码短语)进行加密? |
encrypt_key_cipher | int | none | cipher constants 常量之一。 |
curve_name | string | none | openssl_get_curve_names() 之一。 |
config | string | N/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扩展。
参数列表:
- $key pem证书。
&$output
输出内容。$passphrase
保护密钥。$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_RSA
、 OPENSSL_KEYTYPE_DSA
、 OPENSSL_KEYTYPE_DH
、 OPENSSL_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 字节,最低有效位在前。值0
到63
被编码为./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。 请注意:在 OpenSSL 1.1.1 版本之前,返回加密算法的拼法大小写都有; 从 OpenSSL 1.1.1 开始,…...

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

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

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

【Jenkins】pipeline基本使用
目录 一、pipeline 二、创建pipeline项目 1、安装pipeline插件 2、创建pipeline项目 三、pipeline语法 1、pipeline组成 2、agent:指定流水线的执行位置,流水线中每个阶段都必须在某个地方执行 3、stage:阶段,代表流水线的…...

Bytebase 签约 Vianova,助力欧洲城市交通智能平台中 Snowflake 和 PG 的变更自动化及版本控制
在数字化发展的浪潮中,自动化数据库变更管理成为提升产品上线效率、降低人为失误风险的关键工具,同时促进流程的一致性与标准化,确保合规性和变更的可追溯性。近日,数据库 DevOps 团队协同管理工具 Bytebase 签约欧洲交通数据管理…...

SpringBoot 事务管理Transactional 数据回滚 数据一致性
介绍 SpringBoot当中的事物他保证了一致性,要么全部一起成功(提交),要么一起失败,失败(回滚)后数据会回到当初的样子,是一组操作的集合。 事物类型 开启事物提交事物回滚事物 案…...

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

java---查找算法(二分查找,插值查找,斐波那契[黄金分割查找] )-----详解 (ᕑᗢᓫ∗)˒
目录 一. 二分查找(递归): 代码详解: 运行结果: 二分查找优化: 优化代码: 运行结果(返回对应查找数字的下标集合): 编辑 二分查找(非递归…...

鸿蒙应用/元服务开发-窗口(Stage模型)设置悬浮窗
一、设置悬浮窗说明 悬浮窗可以在已有的任务基础上,创建一个始终在前台显示的窗口。即使创建悬浮窗的任务退至后台,悬浮窗仍然可以在前台显示。通常悬浮窗位于所有应用窗口之上;开发者可以创建悬浮窗,并对悬浮窗进行属性设置等操…...

springboot集成easypoi导出多sheet页
pom文件 <dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-base</artifactId><version>4.1.0</version> </dependency> 导出模板: 后端代码示例: /*** 导出加油卡进便利店大额审批列…...

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

《计算机网络简易速速上手小册》第5章:无线网络和移动通信(2024 最新版)
5.1 WLAN的工作原理 - 揭秘无线局域网络的魔法 5.1.1 基础知识 无线局域网络(WLAN)允许设备通过无线方式连接到一个局部区域网络,主要基于IEEE 802.11标准,俗称Wi-Fi。WLAN的核心是无线路由器,它不仅充当着网络中各设…...

2024PMP考试新考纲-近年PMP真题练一练和很详细解析(3)
今天华研荟继续为您分享和解析PMP真题,一方面让大家感受实际的PMP考试和出题形式,另一方面是通过较详细的解题思路和知识讲解帮助大家最后一个多月有效备考,一次性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 时未成功,出现报错信息
项目场景: 背景: 使用 git 上传文件时,运行 命令 git pull origin 时未成功,出现报错信息 问题描述 问题: $ git pull origin print --allow-unrelated-histories error: Pulling is not possible because you hav…...

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

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

ChatGPT论文指南|ChatGPT论文写作过程中6个润色与查重提示词
论文完成初稿之后,一般情况下,宝子们还需要找专家给我们提出评审意见。找专家评审其实并不容易,即使对老师来说,找人评审论文也是一件苦活。我们这个时候可以通过文字提示让 ChatGPT充当我们的评审专家,为论文提出问题…...

论文阅读:Learning Lens Blur Fields
这篇文章是对镜头模糊场进行表征学习的研究,镜头的模糊场也就是镜头的 PSF 分布,镜头的 PSF 与物距,焦距,光学系统本身的像差都有关系,实际的 PSF 分布是非常复杂而且数量也很多,这篇文章提出用一个神经网络…...

SpringBoot整合Knife4j接口文档生成工具
一个好的项目,接口文档是非常重要的,除了能帮助前端和后端开发人员更快地协作完成开发任务,接口文档还能用来生成资源权限,对权限访问控制的实现有很大的帮助。 这篇文章介绍一下企业中常用的接口文档工具Knife4j(基于…...

爬虫(三)
1.JS逆向实战破解X-Bogus值 X-Bogus:以DFS开头,总长28位 答案是X-Bogus,因为会把负载里面所有的值打包生成X-Boogus 1.1 找X-Bogus加密位置(请求堆栈) 1.1.1 绝招加高级断点(日志断点) 日志断点看有没有X-B值 日志…...

03 动力云客项目之登录功能后端实现
1 准备工作 1.1 创建项目 使用Spring initializr初始化项目 老师讲的是3.2.0, 但小版本之间问题应该不大. 1.2 项目结构 根据阿里巴巴Java开发手册确定项目结构 1.3 分层领域模型 【参考】分层领域模型规约: • DO(Data Object)&am…...

时光峰峦文物璀璨,预防性保护筑安全
在璀璨的历史长河中,珍贵文物如同时间的印记,承载着过往的辉煌。《人文山水时光峰峦——多彩贵州历史文化展》便是这样一场文化的盛宴,汇聚了众多首次露面的宝藏。然而,文物的保存对环境要求极为苛刻,温湿度波动都可能…...

Redis面试题43
人工智能在未来会有哪些可能的发展趋势? 答:人工智能在未来将继续迎来许多可能的发展趋势,以下是一些可能的方向: 更强大的算法和模型:人工智能算法和模型将不断改进和优化,为更复杂的数据和问题提供更强大…...

Redis -- list列表
只有克服了情感的波动,才能专心致志地追求事业的成功 目录 列表 list命令 lpush lpushx rpush rpushx lrange lpop rpop lindex linsert llen lrem ltrim 阻塞命令 小结 列表 列表相当于 数组或者顺序表。 列表类型是用来存储多个有序的字符串&…...

【MATLAB】使用梯度提升树在回归预测任务中进行特征选择(深度学习的数据集处理)
1.梯度提升树在神经网络的应用 使用梯度提升树进行特征选择的好处在于可以得到特征的重要性分数,从而识别出对目标变量预测最具影响力的特征。这有助于简化模型并提高其泛化能力,减少过拟合的风险,并且可以加快模型训练和推理速度。此外&…...

神经网络 | 基于多种神经网络模型的轴承故障检测
Hi,大家好,我是半亩花海。本文主要源自《第二届全国技能大赛智能制造工程技术项目比赛试题(样题) 模块 E 工业大数据与人工智能应用》,基于给出的已知轴承状态的振动信号样本,对数据进行分析,建…...

matplot画3D图的时候报错
使用matplot画3D图的时候,报这个错。 ERROR: Could not find a version that satisfies the requirement mpl_toolkits (from versions: none) ERROR: No matching distribution found for mpl_toolkits 要使用升级命令升级matplot而不是安装 pip install --upgr…...