PHP – 哈希(hashing)


哈希(hashing) 表示一种加密数据(特别是文本)以获得固定长度值的技术。PHP 库包含许多函数,这些函数可以通过应用不同的哈希算法(如 md5SHA2HMAC 等)对数据执行哈希。获取的加密值称为原始密钥的哈希值。

哈希的处理是一个单向的过程,从某种意义上说,不可能为了得到原始密钥而反转哈希。

哈希应用

哈希技术有效地用于以下目的 -

密码身份验证

我们经常注册各种在线应用程序,您需要填写一份表格,在其中为在线帐户创建密码。服务器对您的密码进行哈希处理,哈希值存储在数据库中。登录时,提交的密码经过哈希处理并与数据库中的密码进行比较。这样可以防止您的密码被盗。

数据完整性

哈希的重要用途之一是验证数据是否未被篡改。从 Internet 下载文件时,将显示其哈希值,您可以将其与下载的值进行比较,以确保文件未损坏。

哈希过程

哈希的过程可以用下图来表示 -

PHP 哈希

PHP 哈希算法

PHP 支持多种哈希算法 -

算法 描述
MD5 MD5 是一种 128 位哈希函数,广泛用于软件中,用于验证传输文件的完整性。128 位哈希值通常表示为 32 位十六进制数。例如,单词 “frog” 总是生成哈希值 “8b1a9953c4611296a827abf8c47804d7”
SHA  SHA 代表安全哈希算法。这是由美国国家标准与技术研究院 (NIST) 制定的一系列标准。SHA 是 MD5 的修改版本,用于对数据和证书进行哈希处理。SHA-1 和 SHA-2 是该算法的两个不同版本。SHA-1 是一个 160 位哈希值。SHA-2 实际上是哈希的“家族”,有多种长度,最流行的是 256 位。
HMAC  HMAC(基于哈希的消息身份验证代码)是一种使用哈希函数和密钥的加密身份验证技术。
HKDF  HKDF 是基于 HMAC 消息身份验证代码的简单密钥派生函数 (KDF)。
PBKDF2  PBKDF2(基于密码的密钥派生函数 2)是一种从密码创建加密密钥的哈希算法。

 

PHP 哈希函数

PHP 库包括几个哈希函数 -

hash_algos 函数

此函数返回一个数字索引数组,其中包含支持的哈希算法列表。


 hash_algos(): array

hash_file 函数

该函数返回一个字符串,其中包含以小写 hexits 形式计算的消息摘要。


hash_file(
   string $algo,
   string $filename,
   bool $binary = false,
   array $options = []
): string|false

algo 参数是所选哈希算法的类型(即 “md5”、“sha256”、“haval160,4” 等)。filename 是描述要进行哈希处理的文件位置的 URL,支持 Fopen 包装器。

例子

请看下面的例子 -


<?php
   /* 创建一个文件来计算哈希值 */
   $fp=fopen("Hello.txt", "w");
   $bytes = fputs($fp, "那只敏捷的棕色狐狸跳过了那条懒狗。");
   fclose($fp);
   echo hash_file('md5', "Hello.txt");
?>

将产生以下输出 -

d046369a69837407b7fcc62b320c48d5

hash() 函数

hash() 函数生成哈希值(消息摘要)-


hash(
   string $algo,
   string $data,
   bool $binary = false,
   array $options = []
): string

algo 参数是所选哈希算法的类型(即 “md5”、“sha256”、“haval160,4” 等)。

data 参数是要进行哈希处理的消息。

如果 binary 参数为 “true”,则输出原始二进制数据;“false” 输出小写的 hexits

例子

该函数返回一个字符串,其中包含以小写 hexits 形式计算的消息摘要。


<?php
   echo "使用 SHA256 算法:" . hash('sha256', '那只敏捷的棕色狐狸跳过了那条懒狗。'). PHP_EOL;
   echo "使用 MD5 算法:",hash('md5', '那只敏捷的棕色狐狸跳过了那条懒狗。'), PHP_EOL;
   echo "使用 SHA1 算法:" . hash('sha1', '那只敏捷的棕色狐狸跳过了那条懒狗。');
?>

它将产生以下输出 -

使用 SHA256 算法:eadd7d5cefbf3c020e16632039da5d5f37baabddfe03e905eb44a71b13ad3a42
使用 MD5 算法:d046369a69837407b7fcc62b320c48d5
使用 SHA1 算法:a8c1888c1b6325e7b9b986f45f3f0de87774f323