注册 登录

清河洛

php中的哈希函数

qingheluo2019-12-26清河洛956
单独的hash算法函数:md5函数:md5(string $str[,bool $raw_output=false]):计算字符串的MD5散列值 md5_file(string $filename[,bool $raw_output=false]):计算指定文件的MD5散列值 raw_output:如果为TRUE,将以16字符长度的原始二进制格式返回。默认为false,返回32字符长度的十六进制数字字符串。 sha1函数:string sha1(string $str[,bool $raw_output=false]):计算字符串的sha1散列值 string sha1_file...

单独的hash算法函数:

md5函数:

md5(string $str[,bool $raw_output=false]):计算字符串的MD5散列值
md5_file(string $filename[,bool $raw_output=false]):计算指定文件的MD5散列值
    raw_output:如果为TRUE,将以16字符长度的原始二进制格式返回。默认为false,返回32字符长度的十六进制数字字符串。

sha1函数:

string sha1(string $str[,bool $raw_output=false]):计算字符串的sha1散列值
string sha1_file(string $filename[,bool $raw_output=false])计算指定文件的sha1散列值
    raw_output:如果被设置为TRUE,将以20字符长度的原始二进制格式返回。默认为false,返回40字符长度的十六进制数字字符串。

crc32函数:

crc32(string $str):计算一个字符串的32位循环冗余校验码多项式。
由于PHP的整数是带符号的,在64位上所有结果都是正整数,但是在32位系统上许多校验码返回负整数。因此需要使用sprintf()或printf()的"%u"格式符来获取表示无符号crc32 校验码的字符串。

hash算法框架

公用参数:

$algo:要使用的哈希算法字符串,支持的算法名称可以通过hash_algos()获取
$data:要进行哈希运算的字符串
$filename:要进行哈希运算的文件路径,支持fopen封装器
$raw_output:设置为TRUE输出原始二进制数据,默认FALSE输出小写16进制字符串(长度为原始二进制数据的两倍,因为1个字节数据对应的2个16进制的字符)
$context:哈希运算上下文资源(由hash_init()函数返回的)

hash(string $algo,string $data[,bool $raw_output=false])生成指定字符串指定哈希算法的哈希值

hash_file(string $algo,string $filename[,bool $raw_output=false])生成指定文件指定哈希算法的哈希值

hash_algos():返回一个包含了所有已注册(支持)的哈希算法名称的索引数组

hash_hmac(string $algo,string $data,string $key[,bool $raw_output=false])使用HMAC方法生成带有密钥($key)的哈希值

hash_hmac_file(string $algo,string $filename,string $key[,bool $raw_output=false])使用HMAC方法和给定文件的内容生成带密钥($key)的哈希值

hash_init(string $algo[,int $options=0 [,string $key=NULL]])初始化增量哈希运算上下文

    options:进行哈希运算的可选设置,目前仅支持一个选项:HASH_HMAC。当指定此选项的时候,必须指定key参数 
    key:当options参数为HASH_HMAC时,使用此参数传入进行HMAC哈希运算时的共享密钥。

hash_copy(resource $context)返回哈希运算上下文资源的一个复本。

hash_update(resource $context,string $data)向活跃的哈希运算上下文中追加数据,返回TRUE

hash_update_stream(resource $context,resource $handle[,int $length=-1])从打开的流向活跃的哈希运算上下文中追加数据

    handle:创建流的函数返回的打开的文件句柄。 
    length:要从handle向活跃的哈希运算上下文中追加的最大字符数
    返回从handle向哈希运算上下文中实际追加的字节数量

hash_update_file(resource $hcontext,string $filename)从文件向活跃的哈希运算上下文中填充数据,返回bool值

string hash_final(resource $context[,bool $raw_output=false])结束增量哈希,并且返回摘要结果

string hash_pbkdf2(string $algo,string $password,string $salt,int $iterations[,int $length=0[,bool $raw_output=false]])生成所提供密码的PBKDF2密钥导出

    其实就是使用指定的哈希算法和随机的"盐"对字符串进行迭代计算以防止哈希碰撞
    password:要进行导出的密码
    salt:进行导出时所使用的"盐",这个值应该是随机生成的。 
    iterations:进行导出时的迭代次数。 
    length:导出密钥字符串的长度。如果raw_output为TRUE,此参数为密钥导出数据的字节长度。如果raw_output为FALSE,此参数为密钥导出数据的字节长度的2倍,因为1个字节数据对应的2个16进制的字符。默认值0表示使用所选算法的默认完整输出大小。
    7.2.0版本开始不再支持非加密的哈希函数(adler32,crc32,crc32b,fnv132,fnv1a32,fnv164,fnv1a64,joaat)。

bool hash_equals(string $known_string,string $user_string)可防止时序攻击的字符串比较(相等返回TRUE,否则返回FALSE)

    无论它们是否相等,本函数的时间消耗是恒定的。
    时序攻击属于侧信道攻击/旁路攻击(Side Channel Attack),侧信道攻击是指利用信道外的信息,比如加解密的速度/加解密时芯片引脚的电压/密文传输的流量和途径等进行攻击的方式,一个词形容就是“旁敲侧击”。
    一个最简单的时序攻击的例子,某个函数负责比较用户输入的密码和存放在系统内密码是否相同,如果该函数是从第一位开始比较,发现不同就立即返回,那么通过计算返回的速度就知道了大概是哪一位开始不同的,这样就实现了电影中经常出现的按位破解密码的场景。


网址导航