Security 在经典ASP中有没有办法使用BCrypt散列密码?

Security 在经典ASP中有没有办法使用BCrypt散列密码?,security,hash,asp-classic,passwords,bcrypt,Security,Hash,Asp Classic,Passwords,Bcrypt,我有一个在经典ASP上运行的旧站点。我想开始对密码进行散列,因为它们现在存储在服务器上的纯文本中。我在一个单独的网站上使用了一个BCrypt散列和PHP,并希望能为经典的ASP找到类似的东西 附带问题:我有一个在经典ASP站点上使用PHP运行的库。我可以运行一个PHP解决方案来散列密码吗?这是不明智的吗?阅读OP问题后,我得出结论,OP需要一个散列算法(示例:bcrypt) 好吧,如果你想在经典ASP中寻找散列,它有点像沙漠,没有那么多lbiraries 然而,这个链接实现了一个sha1散列,它

我有一个在经典ASP上运行的旧站点。我想开始对密码进行散列,因为它们现在存储在服务器上的纯文本中。我在一个单独的网站上使用了一个BCrypt散列和PHP,并希望能为经典的ASP找到类似的东西


附带问题:我有一个在经典ASP站点上使用PHP运行的库。我可以运行一个PHP解决方案来散列密码吗?这是不明智的吗?

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

好吧,如果你想在经典ASP中寻找散列,它有点像沙漠,没有那么多lbiraries

然而,这个链接实现了一个sha1散列,它有代码(同时读取所有注释),现在您有了一个可移植的跨代码可实现散列函数

<%
    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时,你会发现你仍然能够使用存储的哈希密码。

我计划很快实现这一点,但现在我的计划是在经典ASP中使用

提供了在经典ASP代码中使用.NET中实现的哈希函数的示例

基本上,使用BCrypt.Net,您应该能够为相关的BCrypt.Net类方法创建“COM可见”包装器接口,然后能够编写如下经典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\u 2
HashPassword\u 3
访问。有关更多详细信息,请参阅SO问题。]

如果我在自己动手实现时了解到更多信息,我会更新这个答案。

Kenny的答案中有一个很好的解决方案,它利用了.NET的SHA512Managed类,不幸的是它有一些bug。在这里,它是与错误消除和代码整理

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

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

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


GitHub上提供了安装说明和代码示例

类似的说明和示例可能会有所帮助。您当前的存储解决方案是什么,即SQL Server?我当前使用的是SQL Server 2008。对于您的附带问题,请不要走这条路。第一个问题是,可以在经典ASP中混合使用VBScript和JScript(奇怪但真实)。如果您找不到VBScript实现,我很肯定您会找到Javascript实现。@Paul已经有一个用于使用PHP运行的站点的函数。它使用GTranslate翻译我们的网站。既然我已经运行了这个PHP,我仍然不应该尝试使用PHP的解决方案?我应该如何向该散列添加盐?我已经更新了答案,盐是用keepass生成的,它有一个生成器函数,所以用你们自己的一个替换这个盐。@Paul我错过了什么吗?@patrickSmith抱歉,另一个问题被删除了,我认为可以用不同的方式处理,仅此而已。明白我的意思了,删除噪音。@patrickSmith Bcrypt不是特定于PHP的,它是您想要的(假设存在VBScript实现,或者您可以安装可以从ASP调用的COM组件),而不是SHA-1,它容易受到暴力攻击。此外,这里显示的不是盐,而是胡椒。salt对于每个用户都是全局唯一的。我非常确定BCrypt没有COM可见类型,因此您必须编写COM包装器才能在ASP.Nice实现中使用它。
dim hashedPassword
hashedPassword = Hash(password, "some random salt value")