2024年PHP开发者大会日本站

哈希函数

目录

  • hash — 生成哈希值(消息摘要)
  • hash_algos — 返回已注册的哈希算法列表
  • hash_copy — 复制哈希上下文
  • hash_equals — 防时序攻击的字符串比较
  • hash_file — 使用给定文件的內容生成哈希值
  • hash_final — 完成增量哈希并返回生成的摘要
  • hash_hkdf — 生成提供的密钥输入的 HKDF 密钥派生
  • hash_hmac — 使用HMAC方法生成带密钥的哈希值
  • hash_hmac_algos — 返回适合于hash_hmac的已注册哈希算法列表
  • hash_hmac_file — 使用HMAC方法和给定文件的內容生成带密钥的哈希值
  • hash_init — 初始化增量哈希上下文
  • hash_pbkdf2 — 生成提供的密码的PBKDF2密钥派生
  • hash_update — 将数据输入活动哈希上下文
  • hash_update_file — 从文件将数据输入活动哈希上下文
  • hash_update_stream — 从打开的流将数据输入活动哈希上下文
添加备注

用户贡献备注 4条备注

artem at it-nt dot ru
16年前
以及一些用于LM哈希的代码

<?php
function LMhash($string)
{
$string = strtoupper(substr($string,0,14));

$p1 = LMhash_DESencrypt(substr($string, 0, 7));
$p2 = LMhash_DESencrypt(substr($string, 7, 7));

return
strtoupper($p1.$p2);
}

function
LMhash_DESencrypt($string)
{
$key = array();
$tmp = array();
$len = strlen($string);

for (
$i=0; $i<7; ++$i)
$tmp[] = $i < $len ? ord($string[$i]) : 0;

$key[] = $tmp[0] & 254;
$key[] = ($tmp[0] << 7) | ($tmp[1] >> 1);
$key[] = ($tmp[1] << 6) | ($tmp[2] >> 2);
$key[] = ($tmp[2] << 5) | ($tmp[3] >> 3);
$key[] = ($tmp[3] << 4) | ($tmp[4] >> 4);
$key[] = ($tmp[4] << 3) | ($tmp[5] >> 5);
$key[] = ($tmp[5] << 2) | ($tmp[6] >> 6);
$key[] = $tmp[6] << 1;

$is = mcrypt_get_iv_size(MCRYPT_DES, MCRYPT_MODE_ECB);
$iv = mcrypt_create_iv($is, MCRYPT_RAND);
$key0 = "";

foreach (
$key as $k)
$key0 .= chr($k);
$crypt = mcrypt_encrypt(MCRYPT_DES, $key0, "KGS!@#$%", MCRYPT_MODE_ECB, $iv);

return
bin2hex($crypt);
}
?>

一些优化?
CraquePipe
16年前
对于那些想要生成NTLM哈希(而不是LM哈希)的人,我发现它很简单。

它使用基本的MD4函数,但密码需要首先使用Unicode小端编码(这可以通过iconv函数实现)。

这可以使用以下代码轻松完成

<?php
function NTLMHash($Input) {
// 将密码从UTF8转换为UTF16(小端)
$Input=iconv('UTF-8','UTF-16LE',$Input);

// 使用MD4哈希加密它
$MD4Hash=bin2hex(mhash(MHASH_MD4,$Input));

// 你也可以使用这个,但mhash在PHP 4和5及以上版本中有效
// 哈希函数只在5或更高版本中有效
//$MD4Hash=hash('md4',$Input);

// 大写化,并非必要,但在NTLM哈希中很常见
$NTLMHash=strtoupper($MD4Hash);

// 返回结果
return($NTLMHash);
}
?>

生成LM哈希需要包含用于生成它的算法的完整脚本。

享受,
CraquePipe。
kungla at gmail dot com
14年前
对于Samba用户密码,您可以使用

(我不太确定salt部分,但对我来说这样有效)

<?php
function CRYPThash($string, $salt = null)
{
if (!
$salt)
$salt = rand(10,99);

return
"{CRYPT}".crypt($string, $salt);
}
?>

在已发布的NTLMHash函数中,您也可以使用

<?php
// 使用MD4哈希加密
$MD4Hash=hash('md4',$Input);
?>

因此,您无需安装mhash库
ocarter at mirabeau dot nl
14年前
关于FreeBSD和PHP-5的说明。

默认情况下这是禁用的;使用security/php5-hash端口
cd /usr/ports/security/php5-hash ; make install clean
(不要像过去一样使用security/pecl-hash端口,请参见20081211的/usr/ports/UPDATING帖子)
To Top