【问题标题】:Is there any way to Hash a password using BCrypt in classic ASP?有什么方法可以在经典 ASP 中使用 BCrypt 散列密码?
【发布时间】:2014-03-09 19:28:28
【问题描述】:

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

附带问题:我有一个在 Classic ASP 站点上使用 PHP 运行的库。我可以运行一个 PHP 解决方案来散列密码吗?还是不建议这样做?

【问题讨论】:

  • 类似的question 可能会有所帮助,another
  • 您目前的存储解决方案是什么,即 SQL Server?
  • 我目前使用的是 SQL Server 2008。
  • 作为对您附带问题的回答,不要走那条路。您的第一个问题是,可以在经典 ASP 中混合 VBScript 和 JScript(奇怪但真实)。如果您找不到 VBScript 实现,我很确定您会找到 Javascript 实现。
  • @Paul 该站点已经有一个使用 PHP 运行的函数。它使用 GTranslate 翻译我们的网站。既然我已经运行了这个 PHP,我仍然不应该尝试使用 PHP 的解决方案?

标签: security hash asp-classic passwords bcrypt


【解决方案1】:

在阅读了 OP 问题后,我得出结论,OP 想要一个散列算法(给出的示例:bcrypt)。

好吧,如果您正在寻找经典 ASP 中的哈希,它有点像沙漠,没有那么多图书馆。

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

<%
    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 时——你会发现你仍然可以使用存储的散列密码。

【讨论】:

  • 如何在哈希中添加盐?
  • 我已经更新了答案,盐是用keepass生成的,它有一个生成器功能,所以用你自己的一个替换这个盐。
  • @Paul 我错过了什么吗?
  • @patrickSmith 抱歉,另一个问题被删除了,我认为它可以以不同的方式处理,仅此而已。明白了我的意思,消除噪音。
  • @patrickSmith Bcrypt 不是 PHP 特定的,它你想要的,(假设那里有一个 VBScript 实现,或者你可以安装一个可以调用的 COM 组件来自 ASP)而不是 SHA-1,它容易受到暴力攻击。此外,这里显示的不是盐,而是胡椒。每个用户的盐值都是全局唯一的。
【解决方案2】:

肯尼的回答中的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")

【讨论】:

    【解决方案3】:

    我计划尽快实现此功能,但目前我的计划是在 Classic ASP 中使用 BCrypt.Net

    This blog post 提供了一个在经典 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_2HashPassword_3 访问。有关更多详细信息,请参阅this answer 到 SO 问题 .net - Overloads in COM interop (CCW) - IDispatch names include suffix (_2, _3, etc)。]

    如果我在自己动手实现此功能时了解更多信息,我将更新此答案。

    【讨论】:

    • 我很确定 BCrypt 没有 COM 可见类型,所以你必须编写一个 COM 包装器才能在 ASP 中使用它。
    【解决方案4】:

    我创建了一个 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 上提供了安装说明和代码示例

    【讨论】:

    • 很好的实现。
    猜你喜欢
    • 2019-07-17
    • 1970-01-01
    • 2021-06-04
    • 1970-01-01
    • 1970-01-01
    • 2013-10-19
    • 2014-05-14
    • 2011-10-05
    • 2015-04-16
    相关资源
    最近更新 更多