【问题标题】:Is there a PHP crypt($string,$salt) equivalent in Vb.Net? Can't find/create any with $saltVb.Net 中是否有等效的 PHP crypt($string,$salt)?无法使用 $salt 找到/创建任何内容
【发布时间】:2019-08-17 23:52:05
【问题描述】:

我正在尝试编译一个用 VB 编写的软件(我正在使用 VisualStudio2010,Framework 4),它允许用户在网站上更改他们的密码(遗憾的是网站默认的 changepassword 表单不起作用,我不能通过 PHP 修复)。

我对PHP和加密没有太多经验,所以我在互联网上寻找了一些VB.Net的解决方案,但尝试了2天后没有得到预期的结果。

我做了一些研究,这就是我学到的: 网站的 PHP 代码使用 crypt($string,$salt) 函数来创建散列密码。 编码是 MD5 算法,因为对于网站数据库中的每个密码,我的 salt 类似于 '$1$ad000000$'。

我尝试在 VB 中复制它,问题从 ComputeHash(buffer() as Byte) 开始,因为它不支持“Salt”字符串。

PHP 上的代码就这么简单:

$EncryptedPassword = crypt($userPassword, $salt);

生成的盐看起来像,例如,“$1$ad000000$”

$EncryptedPassword 长度为 34(12salt + 22hash),但我猜这是 crypt() 函数的标准长度,给定一个特定的盐。

这是我目前在 VB 上尝试的:

Dim Hashata = GetHash("asdkFAofkas", "$1$ad000000$")

Private Function GetHash(ByVal p1 As String, ByVal Salt As String) As Object
        Using hasher As MD5 = MD5.Create()
            Dim dbytes As Byte() = hasher.ComputeHash(Encoding.UTF8.GetBytes(p1 & Salt))
            Dim Conversione = Convert.ToBase64String(dbytes)
            Return Conversione
        End Using
    End Function

返回字符串是一个 24 个字符的字符串,无论“p1”是什么,总是以“==”结尾,我在网上看到这最后两个字符是可选的,所以在使用 Salt 创建密码哈希时,我只是这样做:

Dim StoredPassword = Salt & Hashata.Substring(0,Hashata.Length-2)

当我编写相同的密码时,创建的 StoredPassword (VB) 与数据库中的密码 (PHP) 不一致。 我尝试使用相同的密码在网站上创建多个用户,并且它们在数据库中都以相同的方式散列。

例如,这是我在数据库中的:

-------------------------------------------------
| Username | Password                           |
-------------------------------------------------
|test1     |$1$ad000000$kcpPLtMxsedGD0d39UnXQg  |
-------------------------------------------------
|test2     |$1$ad000000$kcpPLtMxsedGD0d39UnXQg  |
-------------------------------------------------
|test3     |$1$ad000000$kcpPLtMxsedGD0d39UnXQg  |
-------------------------------------------------
|testVB    |$1$ad000000$5u-9pdu3HDnXt5pGdXZNug  |
-------------------------------------------------

test1,test2,test3 有网站上的密码

testVB有上面VB的函数生成的密码

我为 test1、test2、test3 和 testVB 写了完全相同的密码。

数据库上的所有密码长度均为 34 个字符

我已经尝试了以下方法(在 VB 上,因为我无法修改网站的 PHP):

  • 只编码 p1,只编码 Salt,两个变量混合(如上面的代码)

  • 在单独编码或混合它们之前将 p1 和 Salt 转换为十六进制字符串(首先只有一个,然后只有另一个,然后是两者,等等...)

  • 使用不同类型的编码(UTF-7、UTF-16、UTF-32、“默认”和 ASCII)

我很确定问题出在 ComputeHash 函数上,它没有“Salt”属性(它有 offset 和 count 属性,但我没有使用它们),没有它,它可以不要以我想要的方式进行加密。

有没有办法复制 PHP 的 crypt($string, $salt) 函数?

我敢打赌,如果没有 $salt,它们会重合(我已经找到了一些类似的解决方案,但我需要 $salt 进行加密,因为我无法修改网站的 PHP 代码以在没有 $salt 的情况下进行加密)。

非常感谢,抱歉读了这么久,我想确保我没有遗漏任何东西:)

如果还有什么需要补充的,请告诉我!

【问题讨论】:

  • 我的一个朋友,在我给他发了同样的问题后,告诉我可以尝试用 PHP 编写一个 WebService,以便在 VB 中生成密码时调用(这样我可以加密密码使用 PHP 的 crypt() 函数)。我什至没有考虑过这个选项。如果有人有其他答案,我会保留这个问题,我会在我写完这个问题并让它工作后立即用一些代码编辑这个问题。
  • 你不想想要创建一个明确的盐。相反,让图书馆为你做这件事。遵循文档。

标签: php vb.net encryption hash salt


【解决方案1】:

Bcrypt.NET 给你想要的。

string passwordHash = BCrypt.HashPassword("my password");
if (BCrypt.Verify("my password", passwordHash)) {
    // Valid
} else {
    // Incorrect password
}

【讨论】:

    猜你喜欢
    • 2018-09-05
    • 2014-07-14
    • 1970-01-01
    • 2014-12-16
    • 1970-01-01
    • 2014-06-27
    • 2011-01-12
    • 2017-07-14
    • 1970-01-01
    相关资源
    最近更新 更多