我在Classic ASP上运行了一个旧网站。我想开始哈希密码,因为它们现在在服务器上存储了纯文本。我在一个单独的网站上使用了一个带有PHP的BCrypt哈希,并且希望能找到类似于Classic ASP的东西。
方面问题:我有一个在Classic ASP网站上使用PHP运行的库。我可以运行PHP解决方案来散列密码,还是不明智?
答案 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_2
和HashPassword_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上获得