hash
扩展是PHP核心的一部分,使用hash
扩展中的函数不需要安装扩展
hash
是把任意长度的输入通过散列算法变换成固定长度的输出,该输出就是散列值,PHP的hash
扩展提供一些hash
算法
hash
算法一般是非可逆
的,常用作数据签名
1.查看自己的PHP环境支持的hash
算法
<?php
/**
* Created by PhpStorm.
* User: Jiang Haiqiang
* Date: 2020/7/7
* Time: 10:53 PM
*/
$algoList = hash_algos();
var_dump($algoList);
作者的环境输出
array(52) {
[0]=>
string(3) "md2"
[1]=>
string(3) "md4"
[2]=>
string(3) "md5"
[3]=>
string(4) "sha1"
[4]=>
string(6) "sha224"
[5]=>
string(6) "sha256"
[6]=>
string(6) "sha384"
[7]=>
string(10) "sha512/224"
[8]=>
string(10) "sha512/256"
[9]=>
string(6) "sha512"
[10]=>
string(8) "sha3-224"
[11]=>
string(8) "sha3-256"
[12]=>
string(8) "sha3-384"
[13]=>
string(8) "sha3-512"
[14]=>
string(9) "ripemd128"
[15]=>
string(9) "ripemd160"
[16]=>
string(9) "ripemd256"
[17]=>
string(9) "ripemd320"
[18]=>
string(9) "whirlpool"
[19]=>
string(10) "tiger128,3"
[20]=>
string(10) "tiger160,3"
[21]=>
string(10) "tiger192,3"
[22]=>
string(10) "tiger128,4"
[23]=>
string(10) "tiger160,4"
[24]=>
string(10) "tiger192,4"
[25]=>
string(6) "snefru"
[26]=>
string(9) "snefru256"
[27]=>
string(4) "gost"
[28]=>
string(11) "gost-crypto"
[29]=>
string(7) "adler32"
[30]=>
string(5) "crc32"
[31]=>
string(6) "crc32b"
[32]=>
string(6) "fnv132"
[33]=>
string(7) "fnv1a32"
[34]=>
string(6) "fnv164"
[35]=>
string(7) "fnv1a64"
[36]=>
string(5) "joaat"
[37]=>
string(10) "haval128,3"
[38]=>
string(10) "haval160,3"
[39]=>
string(10) "haval192,3"
[40]=>
string(10) "haval224,3"
[41]=>
string(10) "haval256,3"
[42]=>
string(10) "haval128,4"
[43]=>
string(10) "haval160,4"
[44]=>
string(10) "haval192,4"
[45]=>
string(10) "haval224,4"
[46]=>
string(10) "haval256,4"
[47]=>
string(10) "haval128,5"
[48]=>
string(10) "haval160,5"
[49]=>
string(10) "haval192,5"
[50]=>
string(10) "haval224,5"
[51]=>
string(10) "haval256,5"
}
通过以上输出,我们可以看到我们常用的
hash
算法md5
,sha1
,sha256
等。
2.对字符串进行hash
运算
<?php
$data = 'Jhq';
echo md5($data).PHP_EOL;
echo hash('md5', $data).PHP_EOL;
echo sha1($data).PHP_EOL;
echo hash('sha1', $data).PHP_EOL;
以上例程输出
0af598817454940472f92cbb9eafd2d3
0af598817454940472f92cbb9eafd2d3
d688d0d1393b796479878586c48ebc415327d159
d688d0d1393b796479878586c48ebc415327d159
我们可以看到,我们常用的
hash
算法,PHP已经提供更友好的调用方式,但是同样可以通过调用hash
方法实现,两种调用方式的结果是一致的。
3.对文件进行hash
运算
我们创建文件
hash.txt
,文件内容如下
Jhq
对hash.txt进行
hash
运算
<?php
echo md5_file(__DIR__.'/hash.txt').PHP_EOL;
echo hash_file('md5',__DIR__.'/hash.txt').PHP_EOL;
echo sha1_file(__DIR__.'/hash.txt').PHP_EOL;
echo hash_file('sha1',__DIR__.'/hash.txt').PHP_EOL;
以上例程输出
0af598817454940472f92cbb9eafd2d3
0af598817454940472f92cbb9eafd2d3
d688d0d1393b796479878586c48ebc415327d159
d688d0d1393b796479878586c48ebc415327d159
我们可以看到,对文件进行
hash
运算时,常用的hash
算法PHP也提供了友好的调用方式,同样也可以调用hash_file
实现,两种实现方式一致。
另外,我们两次对内容
Jhq
进行hash
运算,一种是通过对字符串,另一种是对文件,但是两次得到结果一致,可见对文件进行hash
运算,可以用作文件内容校验,如果文件内容发生修改,文件的hash
值就发生了变化。
4.hash_hmac算法
hash_hmac
方法可以生成带有密钥的hash
值
<?php
$data = 'Jhq';
echo hash_hmac('md5', $data, 'I am key').PHP_EOL;
echo hash_hmac('sha1', $data, 'I am key').PHP_EOL;
echo hash_hmac_file('md5', __DIR__.'/hash.txt', 'I am key').PHP_EOL;
echo hash_hmac_file('sha1', __DIR__.'/hash.txt', 'I am key').PHP_EOL;
以上例程输出
59cb282953d3bd3f5ac4f4e5092f98e2
4357d4bba84d5e7574309071c27a8504c9c45060
59cb282953d3bd3f5ac4f4e5092f98e2
4357d4bba84d5e7574309071c27a8504c9c45060
同样的,
hash_hmac
也可以对字符串和文件进行hash
运算,并且运算结果一致。