検索
ホームページバックエンド開発PHPチュートリアルPHP ハッシュ情報要約拡張フレームワークの解析

この記事は、PHP のハッシュ情報要約拡張フレームワークを皆さんに紹介するもので、一定の参考価値がありますので、困っている方は参考にしていただければ幸いです。

今日私たちが主に学ぶのは、ハッシュ アルゴリズムではなく、PHP でのハッシュ ハッシュ暗号化関連の拡張関数の使用方法です。 , この種の暗号化は、実際にはより複雑なキー アルゴリズムです。ハッシュ アルゴリズムと同様に、入力した文字列には、ハッシュ テーブルと同様に、対応するハッシュ ハッシュ値があります。本質的には、上記はハッシュ キーと値のマッピングと同じです通常のデータ構造では可能ですが、アルゴリズムはより複雑です。実際、PHP 開発を一定期間行ったことがある限り、md5() と sha1() という 2 つの関数には必ず精通しているはずです。これら 2 つの関数は、それぞれ md5 アルゴリズムと sha1 アルゴリズムのハッシュ暗号化を生成します。ただし、今日私たちが学んでいることは、これら 2 つの関数よりも複雑で、アルゴリズムの形式も豊富です。

ハッシュ情報ダイジェスト アルゴリズムとは

通常、コンテンツの一部をハッシュ関数に入力すると、返されるハッシュ文字列は入力値のハッシュ情報ダイジェストです。 PHP では、md5 であっても sha1 であっても、同じ入力は同じ結果を生成します。したがって、ユーザーのパスワード情報を保存するときは、ハッシュの 1 層だけを使用しないようにします。これは、この形式の暗号化はレインボー テーブルを使用したブルート フォースによって解読される可能性があるためです。パスワードを複数のレイヤーでハッシュ化し、ソルトを追加してハッシュ値を複雑にすることができます。

もちろん、ハッシュ アルゴリズムはよく使われる md5 や sha1 に限定されるものではなく、他にもさまざまな種類のアルゴリズムがありますが、私たちはそれらを一般的に使用しません。ただし、今回紹介する関数は、さまざまな種類のハッシュ暗号化を実行できる関数のセットにすぎず、PHP のデフォルト環境に統合されているため、別途拡張機能を使用する必要はありません。暗号化されたデータの多様化により、さらなる利便性がもたらされます。

PHP でサポートされているハッシュ アルゴリズム

print_r(hash_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
// )

$data = "我们来测试一下Hash算法!"; 

foreach (hash_algos() as $v) { 
    $r = hash($v, $data); 
    echo $v, ':', strlen($r), '::', $r, PHP_EOL; 
}
// md2:32::3d63d5f6ce9f03379fb3ae5e1436bf08
// md4:32::e9dc8afa241bae1bccb7c58d4de8b14d
// md5:32::2801b208ec396a2fc80225466e17acac
// sha1:40::0f029efe9f1115e401b781de77bf1d469ecee6a9
// sha224:56::3faf937348ec54936be13b63feee846d741f8391be0a62b4d5bbb2c8
// sha256:64::8f0bbe9288f6dfd2c6d526a08b1fed61352c894ce0337c4e432d97570ae521e3
// sha384:96::3d7d51e05076b20f07dad295b161854d769808b54b784909901784f2e76db212612ebe6fe56c6d014b20bd97e5434658
// ……

foreach (hash_hmac_algos() as $v) { 
    $r = hash_hmac($v, $data, 'secret'); 
    echo $v, ':', strlen($r), '::', $r, PHP_EOL; 
}
// md2:32::70933e963edd0dcd4666ab9253a55a12
// md4:32::d2eda43ee4fab5afc067fd63ae6390f1
// md5:32::68bf5963e1426a1feff8149da0d0b88d
// sha1:40::504bc44704b48ac75435cdccf81e0f056bac98ba
// sha224:56::8beaf35baedc2cd5725c760ec77d119e3373f14953c74818f1243f69
// sha256:64::23f2e6685fe368dd3ebe36e1d3d672ce8306500366ba0e8a19467c94e13ddace
// sha384:96::740ce7488856737ed57d7b0d1224d053905661ffca083c02c6a9a9230499a4a3d96ff0a951b8d03dbafeeeb5c84a65a6
// ……

hash_algos() 関数と hash_hmac_algos() 関数を通じて、現在の PHP 環境でサポートされているすべてのハッシュ アルゴリズムを取得でき、よく知られた md5 を確認できます。および sha1 のほかに、md2、sha224、ripemd320、fnv1a64 およびその他のめったに見られないアルゴリズムも表示されます。次に、これら 2 つの関数によって返された内容を調べ、hash() 関数と hash_hmac() 関数を使用してデータをハッシュし、その内容を表示すると、各アルゴリズムが異なる暗号化された情報ダイジェストを正常に返すことができ、異なる桁があることがわかります。 。

hmac 関連関数は、PHP のハッシュ アルゴリズムの別の形式で、 hash_hmac() の 3 番目のパラメーターであるキーを必要とするアルゴリズムです。入力内容が同じでキーが同じ場合にのみ、返される結果は同じになります。つまり、この機能は対称暗号化された情報伝達検証トークンに使用できます。たとえば、2 つのシステム間のインターフェイスの相互通信に固定トークンが必要な場合、この関数を使用してそれを実現できます。

md5() と sha1() との比較

この hash() 関数は非常に強力なので、生成されるコンテンツは md5 と同じですか?

// 与 md5 sha1 函数对比

echo hash('md5', '我们来测试一下Hash算法!'), PHP_EOL;
echo md5('我们来测试一下Hash算法!'), PHP_EOL;
// 2801b208ec396a2fc80225466e17acac
// 2801b208ec396a2fc80225466e17acac

echo hash('sha1', '我们来测试一下Hash算法!'), PHP_EOL;
echo sha1('我们来测试一下Hash算法!'), PHP_EOL;
// 0f029efe9f1115e401b781de77bf1d469ecee6a9
// 0f029efe9f1115e401b781de77bf1d469ecee6a9

echo hash('fnv164', '我们来测试一下Hash算法!'), PHP_EOL;
// b25bd7371f08cea4

もちろん、これについては疑いの余地はありませんが、md5() と sha1() という 2 つの関数自体が、hash() 関数の糖衣構文であるとさえ感じます。これら 2 つのアルゴリズムは非常に一般的に使用されているため、PHP は現在の 2 つの関数を直接カプセル化しており、必要なパラメーターは 1 つだけであり、非常にシンプルで便利です。

ファイル ハッシュ

多くのダウンロード サイトでは、ダウンロードされたファイルが完全で同一であるかどうかを確認するための検証と比較を行うために、ダウンロードされたファイルのハッシュ値が提供されます。ファイルハッシュの応用です。実際、率直に言うと、ファイルの内容をハッシュした後に得られるファイルに関する情報をまとめたものにすぎません。もちろん、この一連の関数は PHP でも完全にサポートされています。

/ 文件 HASH

echo hash_file('md5', './create-phar.php'), PHP_EOL;
echo md5_file('./create-phar.php'), PHP_EOL;
// ba7833e3f6375c1101fb4f1d130cf3d3
// ba7833e3f6375c1101fb4f1d130cf3d3

echo hash_hmac_file('md5', './create-phar.php', 'secret'), PHP_EOL;
// 05d1f8eb7683e190340c04fc43eba9db

hkdf と pbkdf2 の HASH アルゴリズム

次に紹介する 2 つのアルゴリズムは、2 つの特殊なハッシュ アルゴリズムです。 hmac に似ていますが、hmac よりも複雑です。

// hkdf pbkdf2 算法

//              算法       明文密码(原始二进制)     输出长度  应用程序/特定于上下文的信息字符串    salt值
$hkdf1 = hash_hkdf('sha256', '123456', 32, 'aes-256-encryption', random_bytes(2));
$hkdf2 = hash_hkdf('sha256', '123456', 32, 'sha-256-authentication', random_bytes(2));
var_dump($hkdf1);
var_dump($hkdf2);
// string(32) "ԇ`q��X�l�
//                      f�yð����}Ozb+�"
// string(32) "%���]�+̀�\JdG��HL��GK��
//                                   -"

//              算法       明文密码     salt值        迭代次数  数据长度
echo hash_pbkdf2("sha256", '123456', random_bytes(2), 1000, 20), PHP_EOL;
// e27156f9a6e2c55f3b72

hmac にはキーのみが必要で、 hash_hkdf() には戻り値の長さ、アプリケーション/コンテキスト固有の情報文字列、ソルト値の 3 つのパラメータが追加され、暗号化されたコンテンツ バイナリで暗号化されたコンテンツです。非常に高度な感じがしませんか? -終わり? Hash_pbkdf2() は、ソルト値、反復回数、データ長の 3 つのパラメータを追加し、パスワード暗号化の優れたヘルパーでもあります。ただし、比較的使用方法は複雑で、セキュリティ要件が非常に高いパスワードの場合は、これら 2 つの機能を使用できます。

hash_equals() 関数はハッシュ比較を実行します

PHP には、ハッシュ値が等しいかどうかを比較する関数も提供されています。友人の中には、概要情報が文字列形式で返されるのだから、=== だけで十分ではないのかと疑問に思う人もいるかもしれません。なぜ比較するために特別な関数が必要なのでしょうか?心配しないで、まずコードを見てみましょう。

// hash_equals 比较函数

$v1 = hash('md5', '测试对比');
$v2 = hash('md5', '测试对比');
$v3 = hash('md5', '测试对比1');

// 比较两个字符串,无论它们是否相等,本函数的时间消耗是恒定的
// 本函数可以用在需要防止时序攻击的字符串比较场景中, 例如,可以用在比较 crypt() 密码哈希值的场景
var_dump(hash_equals($v1, $v2));
var_dump(hash_equals($v1, $v3));
// bool(true)
// bool(false)

我在注释中已经写得很清楚了,hash_equals() 函数主要是可以防止时序攻击。一般来说,这个时序攻击就是根据你的系统运行时间长短来判断你的系统中使用了什么函数或者功能,这都是非常厉害的黑客高手玩的东西。比如说,我们比较用户密码的时候,假设是一位一位的进行比较,那么如果第一个字符错了信息很快就会返回,而如果比较到最后一个才错的时候,程序运行时间就会长很多,黑客就可以根据这个时长来判断当前暴力破解的内容是否一步步达到目标,也让破解难度逐步下降。(普通的字符串比较 === 就是基于位移的)。而 hash_equals() 则是不管怎么比较,相同的 Hash 算法长度的内容返回的时间都是相同的。OpenSSL 、 OpenSSH 等软件都曾出现过这种类似的时序攻击漏洞!

当然,这个我们只做了解即可,同样也是对于安全性有特殊要求的一些项目,就可以使用这个函数来避免出现这种时序攻击的漏洞提高系统安全性。

增量 Hash 操作

最后我们要学习的是一套增量 Hash 的操作函数。其实对于字符串来说,大部分情况下我们直接将字符串拼接好再 Hash 就可以了,并不太需要增量 Hash 的能力。但是如果是对于多个文件或者读写流来说,想要获得多文件的 Hash 值,就可以使用这一套增量 Hash 函数来进行操作了。

// 增量 HASH

$fp = tmpfile();
fwrite($fp, '初始化一个流文件');
rewind($fp);

$h1 = hash_init('md5'); // 开始增量 Hash
hash_update($h1, '测试增量'); // 普通字符串
hash_update_file($h1, './create-phar.php'); // 文件
hash_update_stream($h1, $fp); // 流
$v1 = hash_final($h1); // 结束 Hash 返回结果
echo $v1, PHP_EOL;
// 373df6cc50a1d7cd53608208e91be1e7

$h2 = hash_init('md5', HASH_HMAC, 'secret'); // 使用 HMAC 算法的增量 HASH
hash_update($h2, '测试增量');
hash_update_file($h2, './create-phar.php');
hash_update_stream($h2, $fp);
$v2 = hash_final($h2);
echo $v2, PHP_EOL;
// 34857ee5d8b573f6ee9ee20723470ea4

我们使用 hash_init() 来获得一个增量 Hash 操作句柄并指定好加密算法。然后使用 hash_update() 添加字符串、使用 hash_update_file() 增加文件内容,使用 hash_update_stream() 来增加流内容,最后使用 hash_final() 结束句柄操作进行 Hash 计算并返回结果值。得到的结果值就是包含字符串、文件和流内容一起 Hash 的结果。

推荐学习:《PHP视频教程

总结

说实话,在没有学习今天的内容之前,我也一直以为 PHP 里面只有 md5 和 sha1 这两种 Hash 算法呢。这回真是大开了眼界,我们不仅拥有丰富的算法库,而且还有很多方便的操作函数能够帮助我们方便的使用这些算法,不多说了,学习继续!

测试代码:

https://github.com/zhangyue0503/dev-blog/blob/master/php/202007/source/PHP%E7%9A%84Hash%E4%BF%A1%E6%81%AF%E6%91%98%E8%A6%81%E6%89%A9%E5%B1%95%E6%A1%86%E6%9E%B6.php

以上がPHP ハッシュ情報要約拡張フレームワークの解析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事はsegmentfaultで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。
PHPでの依存関係注射:一般的な落とし穴の回避PHPでの依存関係注射:一般的な落とし穴の回避May 16, 2025 am 12:17 AM

依存関係の指示(di)inphpenhancesscodeflexibility andtestability bydecouplingdepensitycreation fromusage.toemplementdiefectivilly:1)sudiconticainersichyloiavoidovedovedineriering.2)回避装置の回避装置loadbylimitingdencedentotheeorfour.3)adhe

PHP Webサイトをスピードアップする方法:パフォーマンスチューニングPHP Webサイトをスピードアップする方法:パフォーマンスチューニングMay 16, 2025 am 12:12 AM

toimproveyourphpwebsite'sperformance、usethesestrategies:1)codecaching withop cachetospeedupscriptscriptintertention.2)最適化策を選択することを最適化してください

PHPで大量の電子メールを送信する:可能ですか?PHPで大量の電子メールを送信する:可能ですか?May 16, 2025 am 12:10 AM

はい、itispossibletosendmassemailswithphp.1)uselibrarieslikephpmailerorsforfienceemailsending.2)vetseemailstoavoidspamflags.3)emorizeemailsusingdynamicconttoimbroveengagemention.

PHPの依存噴射の目的は何ですか?PHPの依存噴射の目的は何ですか?May 16, 2025 am 12:10 AM

依存関係の指示(di)inphpisadesignpatterntativevevesion ofコントロール(IOC)は、依存性を依存していることによって、微分化された誘惑を依存させ、微分、テスト可能性、および柔軟性を高めることができます

PHPを使用して電子メールを送信する方法は?PHPを使用して電子メールを送信する方法は?May 16, 2025 am 12:03 AM

PHPを使用して電子メールを送信する最良の方法は次のとおりです。1。PHPのMail()関数を基本送信に使用します。 2。phpmailerライブラリを使用して、より複雑なHTMLメールを送信します。 3. SendGridなどのトランザクションメールサービスを使用して、信頼性と分析機能を改善します。これらの方法を使用すると、電子メールが受信トレイに届くだけでなく、受信者を引き付けることもできます。

PHP多次元アレイの要素の総数を計算する方法は?PHP多次元アレイの要素の総数を計算する方法は?May 15, 2025 pm 09:00 PM

PHP多次元アレイの要素の総数を計算することは、再帰的または反復的な方法を使用して行うことができます。 1.再帰的な方法は、アレイを通過し、ネストされた配列を再帰的に処理することによりカウントされます。 2。反復法は、スタックを使用して再帰をシミュレートして深さの問題を回避します。 3. array_walk_recursive関数も実装できますが、手動でカウントする必要があります。

PHPのDo-While Loopsの特徴は何ですか?PHPのDo-While Loopsの特徴は何ですか?May 15, 2025 pm 08:57 PM

PHPでは、ループの特性は、ループ本体が少なくとも1回実行されることを確認し、条件に基づいてループを続行するかどうかを決定することです。 1)条件付きチェックの前にループ本体を実行します。これは、ユーザー入力検証やメニューシステムなど、操作を少なくとも1回実行する必要があるシナリオに適しています。 2)ただし、do-whileループの構文は、初心者間の混乱を引き起こす可能性があり、不要なパフォーマンスオーバーヘッドを追加する可能性があります。

PHPで弦をハッシュする方法は?PHPで弦をハッシュする方法は?May 15, 2025 pm 08:54 PM

PHPの効率的なハッシュ文字列は、次の方法を使用できます。1。MD5関数を使用して高速ハッシュを使用しますが、パスワードストレージには適していません。 2。SHA256関数を使用して、セキュリティを改善します。 3. password_hash関数を使用してパスワードを処理して、最高のセキュリティと利便性を提供します。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

WebStorm Mac版

WebStorm Mac版

便利なJavaScript開発ツール

SublimeText3 Linux 新バージョン

SublimeText3 Linux 新バージョン

SublimeText3 Linux 最新バージョン

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)