2

我有以下 Visual Basic .NET 函数,用于生成存储在内部数据库中的密码哈希:

Public Function HashPassword(ByVal Password As String, ByVal Salt As String) As String
    Dim pwd As String = Password & Salt
    Dim hasher As New Security.Cryptography.SHA256Managed()
    Dim pwdb As Byte() = System.Text.Encoding.UTF8.GetBytes(pwd)
    Dim pwdh As Byte() = hasher.ComputeHash(pwdb)
    Return Convert.ToBase64String(pwdh)
End Function

我需要帮助创建与上述函数等效的 PHP:

例子:

Assuming a password string of: warn
A salt value of: i<|Xf":n_y_Yr"Lor`qAA].QK(2C8AJ:Z"\f&TC7bi=Acw_.w|
The returned hash should be: 0Yq3gR09U1GKfFRzmRxdJXK5jSQowHp/YLGA88p0s18=

我无法在 PHP 中复制哈希。

亲切的问候,

声纳器

4

3 回答 3

2

谷歌的第一个链接:(

http://www.php.net/manual/en/function.hash.php与 sha256 http://www.php.net/manual/en/function.base64-encode.php

$pwd = 'warn';
$salt = 'i<|Xf":n_y_Yr"Lor`qAA].QK(2C8AJ:Z"\f&TC7bi=Acw_.w|';
$pwd .= $salt;
$r1 = hash('sha256', $pwd, true); // binary hash
$r2 = base64_encode($r1); // base64 representation
echo $r2;

输出

0Yq3gR09U1GKfFRzmRxdJXK5jSQowHp/YLGA88p0s18=
于 2013-10-18T19:48:04.720 回答
0

那样的事情怎么样?

private static function hash($string) {
    $result = '';
    if (substr($string, 0, 1) == '#')
        $result = $string;
    else {
        $result = '#' . hash('sha256', $string);
    }
    return $result;
}

您可以只传递用户提供的密码,甚至是已经散列的密码,因为它会检测是否已经散列。当然,这假定#不允许以哈希字符开头的密码(并且之前会被捕获)。

于 2013-10-18T19:44:37.127 回答
0

为了散列密码,我目前使用的函数类似于:

function hashPassword($str, $salt='786df') {
    hash('sha512', $salt.$str.'7');
}

这是一个 SH512,具有动态盐(每个站点)和固定盐(如果 $salt 为空,则有盐,实际上是一个 php 常量)。这个解决方案非常安全,我知道它生成的哈希值很难解密。

像你一样,你可以通过这种方式使用 SHA256,然后使用 base64_encode() (可能没用)。

于 2013-10-18T19:50:32.797 回答