php crc32,md5,sha1,mhash測試結果


總結:php  自帶hash mhash 用於散列只能加密   擴展mcrypt 用於加解密 對文件加密有的文件會隱藏換行,或者讀取方式等影響導致結果不一致。

1.crc32

php:

a.系統crc32()輸入字符串,返回整數(32位),echo輸出32位系統會存在不同可能輸出負數,64不會。

b.$str=mhash(MHASH_CRC32B, 'abcde');返回4字節的字符串,使用bin2hex($str)轉為16進制字符串,hexdec($str)轉為十進制輸入字符串,返回int型或float型

base_convert($str, 16, 10)輸入字符型轉換成字符型(此處為from16進制to10進制)。

c.mysql SELECT CRC32('abcde');

2.MD5 SHA1

md5($str) == bin2hex(mhash(MHASH_MD5, $str))
sha1($str) == bin2hex(mhash(MHASH_SHA1, $str))
AND
pack("H*", md5($str)) == mhash(MHASH_MD5, $str)
pack("H*", sha1($str)) == mhash(MHASH_SHA1, $str)

3.加密和散列

下面部分轉自:http://jichangxucode.blog.163.com/blog/static/207713391201261910134418/

主要有crypt(),md5(),sha1()這3個函數。還有加密擴展庫mcrypt和mhash

1.crypt()(單向加密,安全性較低)

String crypt(String str[,String salt]);

salt參數為加密時使用的干擾串,如果省去,會隨機生成一個干擾串,該函數支持4種算法和長度。

2.md5()

String md5(String str[,bool raw_output]);

raw_output參數默認為false,如果為真,函數返回一個二進制形式的密文。

3.sha1()     secure hash algorithm(安全哈希算法)

String sha1(String str[,bool raw_output]);

函數返回一個40位的16進制數,如果raw_output為真,則返回一個20位的2進制數。

                                                  Mcrypt庫

libmcrypt.dll 到windows(php.ini配置的initDir 目錄),然后配置php.ini文件中的extension=libmcrypt.dll;

mcypt支持20多種加密算法和8種加密模式。

mcypt_list_algorithms()和mcypt_list_modes()都返回一個數組,可以用foreach循環出來查看mcypt支持的加密算法和模式。

<?php
$en_dir = mcrypt_list_algorithms() ;
echo "Mcrypt支持的算法有:";
foreach($en_dir as $en_value){
   echo '<br>';
   echo $en_value." ";
}
?>
<?php
$mo_dir = mcrypt_list_modes() ;
echo "<p>Mcrypt支持的加密模式有:";
foreach($mo_dir as $mo_value){
   echo '<br>';
   echo $mo_value." ";
}
?>

輸出為:

Mcrypt支持的算法有:
cast-128 
gost 
rijndael-128 
twofish 
arcfour 
cast-256 
loki97 
rijndael-192 
saferplus 
wake 
blowfish-compat 
des 
rijndael-256 
serpent 
xtea 
blowfish 
enigma 
rc2 
tripledes

Mcrypt支持的加密模式有:
cbc 
cfb 
ctr 
ecb 
ncfb 
nofb 
ofb 
stream

應用mcrypt庫的一個例子:

<?php
$str = "被加密的內容:相見時難別亦難 東風無力百花殘";
$key = "key:111";     //密匙
$cipher = MCRYPT_DES; //加密算法
$modes = MCRYPT_MODE_ECB;//加密模式
$iv = mcrypt_create_iv(mcrypt_get_iv_size($cipher,$modes),MCRYPT_RAND); //初始化向量
echo "加密前:".$str."<p>";
//加密:
$str_encrypt = mcrypt_encrypt($cipher,$key,$str,$modes,$iv);//里面的$cipher,$modes可以不與mcrypt_get_iv_size里的一樣
echo "加密后:".$str_encrypt." <p>";
$str_decrypt = mcrypt_decrypt($cipher,$key,$str_encrypt,$modes,$iv);//要跟上面的加密里的$cipher,$modes一樣才能還原
echo "還原:".$str_decrypt;
?>

輸出:

加密前:被加密的內容:相見時難別亦難 東風無力百花殘

加密后: 鞤"猀車摰 D瓇A?Jo鷟?咦N翢? 蟮E6?鄹[p}??

還原:被加密的內容:相見時難別亦難 東風無力百花殘

                                                 Mhash庫

libmash.dll 配置方式同上

mhash支持md5,sha1,crc32等多種散列算法,可以使用mhash_count()和mhash_get_hash_name()輸出支持的算法名稱。

<?php
$num = mhash_count();          //函數返回最大的hash id
echo "Mhash庫支持的算法有:";
for($i = 0; $i <= $num; $i++){
echo '<br>';
echo $i."=>".mhash_get_hash_name($i);    //輸出每一個hash id 的名稱
}
?>

輸出:

Mhash庫支持的算法有:
0=>CRC32
1=>MD5
2=>SHA1
3=>HAVAL256
4=>
5=>RIPEMD160
6=>
7=>TIGER
8=>GOST
9=>CRC32B
10=>HAVAL224
11=>HAVAL192
12=>HAVAL160
13=>HAVAL128
14=>TIGER128
15=>TIGER160
16=>MD4
17=>SHA256
18=>ADLER32

mhash應用小例子:

<?php
$filename = '07.txt';
$str = file_get_contents($filename);//獲取文件全部內容
$hash = 2;    //The hash id. One of the MHASH_XXX constants.
$password = '111';
$salt = '4444';//干擾串 8字節,小於8字節的用0補齊
$key = mhash_keygen_s2k(1,$password,$salt,10);//生成密鑰. 1表示1個MHASH_XXX constant,10表示字節長度
$str_mhash = bin2hex(mhash($hash,$str,$key));//講2進制轉化為16進制,生成16進制的校驗碼
echo "文件07.txt的校驗碼是:".$str_mhash;
?>

輸出:

文件07.txt的校驗碼是:d03e414026e6e5f0699e8d66e3a1a1e23caea04f


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM