Php 简明教程

PHP – Hashing

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

哈希处理是一个单向过程,从某种意义上说,无法对哈希进行反转,因而无法获取原始键。

Applications of Hashing

哈希技术被有效用于以下目的:

Password Authentication

我们通常会注册各种在线应用程序,例如 gmail、Facebook 等。您需要填写一个表格,您在其中为在线帐户创建密码。服务器会对您的密码进行哈希,哈希值存储在数据库中。当您登录时,提交的密码会被哈希,并与数据库中的密码进行比较。这让你的密码不会被盗用。

Data Integrity

哈希的一个重要用途是验证数据没有被篡改。当您从互联网下载文件时,它会显示给您哈希值,您可以用此哈希值来与下载的文件进行对比,确保文件没有被破坏。

The Process of Hashing

可以由下图查看哈希处理过程:

php hashing

Hashing Algorithms in PHP

PHP 支持多个哈希算法:

  1. MD5 - MD5 是一种 128 位的哈希函数,广泛用于软件中,用于验证传输文件的完整性。128 位的哈希值通常表示为 32 位十六进制数。例如,“frog”这个单词总是生成哈希值“8b1a9953c4611296a827abf8c47804d7”

  2. SHA - SHA 的全称是安全散列算法,由美国国家标准与技术研究院(NIST)制定的一系列标准。SHA 是 MD5 的改进版本,用于哈希数据和证书。SHA-1 和 SHA-2 是该算法的不同版本。SHA-1 是一个 160 位的哈希算法。SHA-2 实际上是一个哈希“系列”,有各种长度,其中最受欢迎的是 256 位。

  3. HMAC - HMAC(基于哈希的消息认证码)是一种加密认证技术,使用哈希函数和密钥。

  4. HKDF - HKDF 是一个简单的密钥派生函数 (KDF),基于 HMAC 消息认证码。

  5. PBKDF2 - PBKDF2(基于密码的密钥派生函数 2)是一种哈希算法,可根据密码创建加密密钥。

Hash Functions in PHP

PHP 库包含多个哈希函数:

The hash_algos Function

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

hash_algos(): array

The hash_file Function

该函数返回一个字符串,其中包含计算出的消息摘要,小写十六进制。

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

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

Example

请看以下示例:

<?php
   /* Create a file to calculate hash of */
   $fp=fopen("Hello.txt", "w");
   $bytes = fputs($fp, "The quick brown fox jumped over the lazy dog.");
   fclose($fp);
   echo hash_file('md5', "Hello.txt");
?>

它将生成以下 output

5c6ffbdd40d9556b73a21e63c3e0e904

The hash() Function

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

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

algo 参数是所选哈希算法的类型(即 “md5”、“sha256”、“haval160,4”等)。 data 参数是要进行哈希处理的消息。如果 binary 参数为 true ,它将输出原始二进制数据;“false” 输出小写十六进制。

Example

该函数返回一个字符串,其中包含计算出的消息摘要,小写十六进制。

<?php
   echo "Using SHA256 algorithm:" . hash('sha256', 'The quick brown fox jumped over the lazy dog.'). PHP_EOL;
   echo "Using MD5 algorithm:",hash('md5', 'The quick brown fox jumped over the lazy dog.'), PHP_EOL;
   echo "Using SHA1 algorithm:" . hash('sha1', 'The quick brown fox jumped over the lazy dog.');
?>

它将生成以下 output

Using SHA256 algorithm:68b1282b91de2c054c36629cb8dd447f12f096d3e3c587978dc2248444633483
Using MD5 algorithm:5c6ffbdd40d9556b73a21e63c3e0e904
Using SHA1 algorithm:c0854fb9fb03c41cce3802cb0d220529e6eef94e