返回SHA512哈希的VB.Net控制台应用程序

返回SHA512哈希的VB.Net控制台应用程序,vb.net,ms-access,Vb.net,Ms Access,我试图在VB.Net(2008)中编写一个控制台应用程序,以接受命令行参数输入(密码)并输出散列。我进行了修改,使其能够接受一个参数,并添加了我自己的salt/key,但与相同密码和salt的PHP输出相比,输出似乎不正确 我需要这样的东西,所以我将有一个方法来获得一个SHA512哈希使用MS访问VBA。你能推荐一个比我正在尝试的更好的解决方案吗,或者给我指出一个比上面的链接更简单的解决方案吗?我可以在这里发布我的代码,但它很长 Edit1: 我现在正在使用下面来自Smerkin Gherkin

我试图在VB.Net(2008)中编写一个控制台应用程序,以接受命令行参数输入(密码)并输出散列。我进行了修改,使其能够接受一个参数,并添加了我自己的salt/key,但与相同密码和salt的PHP输出相比,输出似乎不正确

我需要这样的东西,所以我将有一个方法来获得一个SHA512哈希使用MS访问VBA。你能推荐一个比我正在尝试的更好的解决方案吗,或者给我指出一个比上面的链接更简单的解决方案吗?我可以在这里发布我的代码,但它很长

Edit1: 我现在正在使用下面来自Smerkin Gherkin的代码,但是我的PHP哈希和VB.Net哈希仍然不匹配。我使用的密码和salt(仅作为测试)是:Password1 abcd1234

我的VB.Net代码如下所示: hasher.HexHash(“密码1”、“abcd1234”)

我的PHP代码如下所示: echo hash_hmac(“sha512”、“密码1”、“abcd1234”)

VB.Net返回以下内容: 4E1112E5D2995ECDBF57777BA2B5425B86164044B1564DA2E0232F5E5BC4A4DA34E9AD8C2E5F664FE795C5ED12753B565636164F239070C45B8278F268A8A0860

PHP返回以下内容: 46d338722b931f2e025ecaa7853da070ad74a4e648c48633388740d647f1edba7f83afe43a104d7f7e0662e130a184743caea39177bc8deda030087d9e425e09


知道我做错了什么吗?

最简单的选择是使用
System.Security.Cryptography.SHA512管理的
对象。下面是一个将SHA512哈希值作为base64字符串或十六进制字符串返回的示例

公共类SHA512Hasher
私人分新
'防止实例化
端接头
公共共享函数Base64Hash(ByVal clearText作为字符串)作为字符串
Dim hashedBytes As Byte()=计算哈希(明文)
返回Convert.ToBase64String(hashedBytes)
端函数
公共共享函数Base64Hash(ByVal clearText作为字符串,ByVal salt作为字符串)作为字符串
返回Base64Hash(salt和clearText)
端函数
公共共享函数HexHash(ByVal clearText作为字符串)作为字符串
Dim hashedBytes As Byte()=计算哈希(明文)
'通过转换每个字节来构建十六进制字符串。
将hexString作为新的System.Text.StringBuilder()进行调整
对于i As Int32=0到hashedBytes.Length-1
Append(hashedBytes(i).ToString(“X2”))使用“X2”表示小写
下一个
返回hexString.ToString()
端函数
公共共享函数HexHash(ByVal clearText作为字符串,ByVal salt作为字符串)作为字符串
返回HexHash(salt和clearText)
端函数
私有共享函数computeHash(ByVal明文作为字符串)作为字节()
作为新文本的Dim编码器。UTF8Encoding()
DimSha512Hasher作为新系统。安全。加密。SHA512Managed()
返回sha512hasher.ComputeHash(encoder.GetBytes(明文))
端函数
末级
下面是一个简单的控制台应用程序,用于将一些输出打印到命令行

模块1
副标题()
变暗清除为String=“Foo”
淡盐为String=“Salted”
Console.WriteLine(SHA512Hasher.Base64Hash(清除))
Console.WriteLine(SHA512Hasher.Base64Hash(清除,盐))
Console.WriteLine(SHA512Hasher.HexHash(清除))
Console.WriteLine(SHA512Hasher.HexHash(透明,盐))
端接头
端模块
Edit1-更新以响应有问题的Edit1 php函数使用一个键对值进行散列,该键不同于对散列加盐(在明文前面加盐值)。要使用的.Net对象是
System.Security.Cryptography.HMACSHA512
。上述代码的更新版本为:

公共类HMACSHA512Hasher
私人分新
'防止实例化
端接头
公共共享函数Base64Hash(ByVal clearText作为字符串)作为字符串
返回Base64Hash(明文,String.Empty)
端函数
公共共享函数Base64Hash(ByVal明文作为字符串,ByVal键作为字符串)作为字符串
Dim hashedBytes As Byte()=计算哈希(明文,键)
返回Convert.ToBase64String(hashedBytes)
端函数
公共共享函数HexHash(ByVal clearText作为字符串)作为字符串
返回HexHash(明文,String.Empty)
端函数
公共共享函数HexHash(ByVal明文作为字符串,ByVal键作为字符串)作为字符串
Dim hashedBytes As Byte()=计算哈希(明文,键)
'通过转换每个字节来构建十六进制字符串。
将hexString作为新的System.Text.StringBuilder()进行调整
对于i As Int32=0到hashedBytes.Length-1
Append(hashedBytes(i).ToString(“x2”))使用“x2”表示小写
下一个
返回hexString.ToString()
端函数
私有共享函数computeHash(ByVal明文作为字符串,ByVal键作为字符串)作为字节()
作为新文本的Dim编码器。UTF8Encoding()
DimSha512Hasher作为新系统。安全。加密。HMACSHA512(编码器。GetBytes(密钥))
返回sha512hasher.ComputeHash(encoder.GetBytes(明文))
端函数
末级

我还更改了hex函数以返回小写哈希值以匹配php结果。

看起来您的代码将完成我需要它完成的任务。我不知道SHA512哈希总是用Base64或十六进制编码。您知道PHP的hash_hmac函数的默认值是什么吗?在我看来,它似乎是十六进制的。也许这就是为什么我使用其他代码时出现不匹配。我很确定它没有返回十六进制,因为散列中有很多非十六进制字符。Sha512Managed.ComputeHashed方法返回一个字节数组,通常将其存储在一个字符串中,作为Base64或十六进制,因为它可以防止非显示字符出现显示问题。我包括了这两个选项,因为它们是最常见的,但是您可以通过实现与t中类似的函数,以字节数组或任何其他格式返回哈希值