有没有办法在经典ASP中使用BCrypt来哈希密码?

时间:2014-02-11 19:46:46

标签: security hash asp-classic passwords bcrypt

我在Classic ASP上运行了一个旧网站。我想开始哈希密码,因为它们现在在服务器上存储了纯文本。我在一个单独的网站上使用了一个带有PHP的BCrypt哈希,并且希望能找到类似于Classic ASP的东西。

方面问题:我有一个在Classic ASP网站上使用PHP运行的库。我可以运行PHP解决方案来散列密码,还是不明智?

4 个答案:

答案 0 :(得分:3)

在阅读OP问题后,我得出结论,OP需要一个散列算法(例如:bcrypt)。

好吧,如果你在寻找经典ASP中的哈希,它有点像沙漠,而不是那么多的lbiraries。

然而,这个链接实现了一个sha1哈希,http://forums.aspfree.com/code-bank-54/asp-classic-sha1-hash-82166.html它有代码(也读取所有注释),现在你有一个可移植的交叉代码可实现的哈希函数。

<%
    Dim strPassWord, strHash, salt
    salt = "6XBMkpz39m8RFCpwt1Cofzbg1TTIN7yTGzMlayIfy9yBOPgX2zhfXM9X5mqv8HT6"
    strPassWord = "secret"
    strHash = hex_sha1(strPassWord & salt)

    Response.Write("<p><b>strPassWord:</b> " & strPassWord & "</p>")
    Response.Write("<p><b>strHash:</b> " & strHash & "</p>")
%>

扩展到C#,Javascript,Python,......等等。所以在未来的某个地方 - 当你决定抛弃经典的ASP时 - 你会发现你仍然可以使用存储的散列密码。

答案 1 :(得分:3)

Kenny的答案中的blog post有一个很好的解决方案,利用.NET的SHA512Managed类,不幸的是它有一些错误。这是错误消息和代码整理。

Function Hash(stringToHash, salt)

    const SITE_WIDE_SALT = "THIS IS A SITE WIDE SALT, BUT COULD BE A GUID"

    dim objUnicode : set objUnicode = CreateObject("System.Text.UnicodeEncoding")
    dim objSHA512 : set objSHA512 = Server.CreateObject("System.Security.Cryptography.SHA512Managed")

    dim saltedString : saltedString = SITE_WIDE_SALT & stringToHash & salt
    dim arrByte : arrByte = objUnicode.GetBytes_4(saltedString)
    dim strHash : strHash = objSHA512.ComputeHash_2((arrByte))

    Hash = ToBase64String(strHash)

    set objUnicode = nothing
    set objSHA512 = nothing
End Function


' Helper method for function SHA512Hash
Function ToBase64String(rabyt)

    'Ref: http://stackoverflow.com/questions/1118947/converting-binary-file-to-base64-string
    dim xml : set xml = CreateObject("MSXML2.DOMDocument.3.0")
    xml.loadXml "<Root></Root>"
    xml.documentElement.dataType = "bin.base64"
    xml.documentElement.nodeTypedValue = rabyt

    ToBase64String = Replace(xml.documentElement.Text, vbLf, "")

    set xml = nothing
End Function

要使用它,只需使用单独的盐调用Hash函数。

dim hashedPassword
hashedPassword = Hash(password, "some random salt value")

答案 2 :(得分:2)

我计划很快实现这一点,但目前我的计划是在Classic ASP中使用BCrypt.Net

This blog post提供了在经典ASP代码中使用.NET实现的散列函数的示例。

基本上,使用BCrypt.Net,您应该能够创建一个COM-visible&#39;相关BCrypt.Net类方法的包装器接口,然后能够编写如下的经典ASP代码:

Dim objBCrypt
Set objBCrypt = CreateObject("BCryptComInterface")

Dim strHash
Set strHash = objBCrypt.HashPassword(the_password_to_be_hashed) 

请注意,BCrypt类BCrypt.Net.BCrypt有三个重载方法,名称为HashPassword;我假设COM接口中的方法HashPassword对应于只接受单个参数的.NET方法。 [其他方法将以HashPassword_2HashPassword_3的形式访问。有关详细信息,请参阅this answer至SO问题.net - Overloads in COM interop (CCW) - IDispatch names include suffix (_2, _3, etc)。]

如果我在自己实现这一目标时了解更多信息,我会更新此答案。

答案 3 :(得分:1)

我创建了一个COM DLL,允许您在Classic ASP中使用Bcrypt:

https://github.com/as08/ClassicASP.Bcrypt

我还为Argon2和PBKDF2创建了类似的COM DLL:

https://github.com/as08/ClassicASP.Argon2

https://github.com/as08/ClassicASP.PBKDF2

安装说明和代码示例可在GitHub上获得