PHP手册-函数参考-加密扩展
|
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 个字符的字符串
|
<?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=
<?php
var_dump(random_int(100, 999)); // 输出:int(961)
var_dump(random_int(-1000, 0)); // 输出:int(-632)
<?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
)
<?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
<?php
$file = 'hmac.txt’;
$key = 'md5-key';
echo hash_file('md5', $file);
echo hash_hmac_file('md5', $file, $key);
// 输出:
hamc.txt内容为abcdefghijklmnopqrstuvwxyz
c3fcd3d76192e4007dfb496cca67e13b
c30c586135ef70cdad8a8db52912eadc
/**
* @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
/**
* @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
$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。
<?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�����
还原:今天是星期五
$num = mhash_count(); //函数返回最大的hash id
echo "Mhash库支持的算法有:";
for($i = 0; $i <= $num; $i++){
echo '<br>';
echo $i."=>".mhash_get_hash_name($i); //输出每一个hash id 的名称
}
<?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
<?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));
// 在终端执行下述两行命令生成密钥、公钥:
// 密钥生成
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
<?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
<?php
$hash = '$2y$11$ZYpIjzZ/dd3SeZeqFYMolO7VElissnyaFAtmY.RKPLbcb3cPhwB7W';
if (password_verify('rasmuslerdorf', $hash)) {
echo 'Password is valid!';
} else {
echo 'Invalid password.';
}
// 输出:
Password is valid!
PHP手册-函数参考-加密扩展的更多相关文章
- PHP手册-函数参考-日期与时间相关扩展
一.Calander.日期/时间.HRTime扩展的对比 Calendar 日期/时间 HRTime 简介 历法扩展集包括了一系列用于在不同历法间进行转换的函数,它是以Julian Day计数为中 ...
- hive函数参考手册
hive函数参考手册 原文见:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF 1.内置运算符1.1关系运算符 运 ...
- LoadRunner中常用函数参考手册
基础篇1:LoadRunner中常用函数参考手册 常用函数列表 web_url web_submmit_form VS web_submmit_data VS web_custom_request w ...
- Arduino参考手册-函数和变量及电路图
标题: Arduino参考手册-函数和变量及电路图 作者: 梦幻之心星 sky-seeker@qq.com 标签: [#Arduino,#参考手册,#函数,#变量] 目录: [Arduino] 日期: ...
- PHP的openssl加密扩展使用小结
h2:first-child, body>h1:first-child, body>h1:first-child+h2, body>h3:first-child, body>h ...
- mysql常用函数参考
mysql常用函数参考 对于针对字符串位置的操作,第一个位置被标记为1. ASCII(str) 返回字符串str的最左面字符的ASCII代码值.如果str是空字符串,返回0.如果str是NULL, ...
- PHP openssl加密扩展使用总结
1.检查服务器是否已安装了openssl组件,没有则先安装好 openssl version [-a] 2.对称加密 查询openssl支持的对称加密算法 openssl_get_cipher_met ...
- PHP mcrypt加密扩展使用总结
在开发中,很多时候我们在前后端交互中需要对一些敏感数据进行一定的加密.PHP中有提供了mcrypt的这样一个加密扩展实现对数据的加密解密. 一.mcrypt扩展的安装 在低版本的PHP中需要在配置文件 ...
- Mysql 函数大全- 5.6 中文解释函数参考
mysql 函数大全 5.6 函数参考 5.6函数参考 (只翻译部分,细节查看相关英文版) 12.1功能和操作员参考 12.2表达式评估中的类型转换 12.3运营商 12.4控制流功能 12.5 ...
随机推荐
- .Net Core Package lose or not match
错误.警告的说明: 示例一: 严重性:警告 代码:MSB3106 说明 :程序集强名称“C:\Users\$(computerName)\.nuget\packages\$(packageName)\ ...
- Python数据类型补充2
四.列表 常用操作+内置的方法: 1.按索引存取值(正向存取+反向存取):即可存也可以取 # li=['a','b','c','d'] # print(li[-1]) # li[-1]='D' # p ...
- Winform 设置控件值
private void SetControlValue(Control control, object value) { try { control.FindForm().Invoke((Actio ...
- 【Ruby】【目录 & 引用 & 文件 】
[[目录]] 当前文件在根目录下一个文件夹下 引用当前文件所在目录上一级目录下某.rb文件 方法一 require File.join(File.dirname(FILE),'..','test_on ...
- L2-021 点赞狂魔
会set的基础用法就可以A了,虽然是L2题,但是不难,代码如下,很好理解,set在这里不解释了自己去网上查一下就明白了: #include<stdio.h> #include<str ...
- [原][osg][QT]osg与QT界面结合的简单例子二
//main.cpp #include "VREObliqueEditorQTWindow.h" #include <QtWidgets/QApplication> # ...
- OpenModelica部分库缺失问题解决
问题:写下面这段代码时,保存时没有出错,但执行时提示找不到initialState这个函数. when time > redTime then state1 := Modelica.Math.R ...
- SQL中 根据行号设置每行数据的排序数值
根据行号自动把当前行号插入到某列中 实现排序 update tempTable set DisplayOrder = right( CAST(rownum as NVARCHAR),5) from( ...
- 在Windows下解决git ERROR: Permission to XXX.git denied to user
这种情况一般都是由于登陆了不同的git仓库在本地记录了凭证导致的,比如登陆了两个不同的github账号. 1.控制面板 2.删除凭证再重新提交将会重新输入用户名和密码 以上.
- C# 遍历文件夹筛选目标文件
有近400G的数据,首先需要写程序把目标文件标准化名称(相当耗时,各种情形,间接说明在数据采集过程中标准化操作的重要性,这样会给后续处理带来很多不必要的麻烦和消耗) 网上找了个方法还不错,还有一种递归 ...