当前位置: 首页 > 知识库问答 >
问题:

多少盐安全是太多盐安全

宗弘扬
2023-03-14
    Public Function EncryptPassword(Password As String) As String

        Dim EPassword As String = String.Empty

        ' Generate Random 128 Base64 Salt String
        Dim Salt As String = Var.Simple3Des.GenerateSalt

        ' Divide into Substrings, and combine into splitable string
        Dim SmallSalts As String = Salt.Substring(0, 32) + "." + Salt.Substring(32, 32) + "." + Salt.Substring(64, 32) + "." + Salt.Substring(96, 32)

        ' Create the Salt Array
        Dim SaltArray = Split(SmallSalts, ".")

        ' Randomly Choose part of the array to actually use as salt
        Dim rnd As New Random
        Dim TrueSalt As String = SaltArray(rnd.Next(0, SaltArray.Length))

        ' Encrypt The Password
        Dim Security As New Var.Simple3Des(TrueSalt)
        EPassword = Security.EncryptData(Password)

        ' Divide up the salt and password and place into same string
        Dim PasswordString As String = Salt.Substring(0, 16) + EPassword.Substring(0, 6) + Salt.Substring(16, 112) + EPassword.Substring(6, EPassword.Length - 6)

        Return PasswordString

    End Function

然后我使用相同的公式来解密密码,通过尝试所有可能的子字符串组合,直到找到正确的一个。

 Public Function DecryptPassword(NtID As String)

            ' Grab The Users Encrypted Password
            Dim UserID As Integer = GetAppUserID(NtID)
            Dim User As Users = Var.db.Web.Users.Find(UserID)
            Dim EPassword = User.Password

            ' Divided the Encrypted Password Into Salt and Actual Password
            Dim Salt As String = EPassword.Substring(0, 16) + EPassword.Substring(22, 112)
            Dim Password As String = EPassword.Substring(16, 6) + EPassword.Substring(134, EPassword.Length - 134)
            Dim DPassword As String = String.Empty

            ' Try each substring of Salt until password is Decrypted.
            Try
                If DPassword = String.Empty Then
                    Dim Security As New Var.Simple3Des(Salt.Substring(0, 32))
                    DPassword = Security.DecryptData(Password)
                End If
            Catch ex As Exception
                DPassword = String.Empty
            End Try

            Try
                If DPassword = String.Empty Then
                    Dim Security As New Var.Simple3Des(Salt.Substring(32, 32))
                    DPassword = Security.DecryptData(Password)
                End If
            Catch ex As Exception
                DPassword = String.Empty
            End Try

            Try
                If DPassword = String.Empty Then
                    Dim Security As New Var.Simple3Des(Salt.Substring(64, 32))
                    DPassword = Security.DecryptData(Password)
                End If
            Catch ex As Exception
                DPassword = String.Empty
            End Try

            Try
                If DPassword = String.Empty Then
                    Dim Security As New Var.Simple3Des(Salt.Substring(96, 32))
                    DPassword = Security.DecryptData(Password)
                End If
            Catch ex As Exception
                DPassword = String.Empty
            End Try

            Return DPassword
        End Function

我的问题是A.除了可能的性能问题之外,这种方法还会带来什么危险?
B.这种方法是否矫枉过正,像这样加盐和存储盐/密码有必要吗?c.如果没有必要,我还可以使用什么其他方法来加盐和存储盐/密码?

共有1个答案

曹季同
2023-03-14

这里有一个很好的站点,可以讨论您感兴趣的东西:https://crackstation.net/hashing-security.htm。他们所说的总的观点是:

  1. 如果您自己不小心,干扰精心编制的安全算法实际上会降低其安全性。
  2. 这是矫枉过正的,因为您必须假设攻击者在破解数据库之前会获得您的代码,这样他们就会知道您的方案。
  3. 简单地存储散列和盐就可以了。这就是散列和盐的要点。

我经常使用crackstation页面作为散列安全性的一般参考。我强烈建议阅读它,因为它可能包含大量的信息,你会发现相关的,而我在这里省略了。

 类似资料:
  • 问题内容: 因此,我在SO上发现应该将密码和“ salt”一起散列。(可在此处和此处找到文章。) 这是代码: 现在,我需要同时将和和保存在MySQL中,如下所示: ** 当然会被散列,而不是以纯文本形式存储。 我只是想知道以这种方式进行操作实际上是否有意义,因为通过这种方式,黑客或其他任何人也都可以理解吗?因此,如果他们破解了密码并且看到了密码,他们会自动知道密码是?还是因为他不知道密码(因为密码

  • 问题内容: 我正在建立一个可能有70列以上的表格。我现在正在考虑将其拆分,因为每次访问表时都不需要列中的某些数据。再说一次,如果我这样做,我就不得不使用联接。 在什么时候(如果有的话)是否认为列太多? 问题答案: 一旦超过数据库支持的最大限制,就认为它太多了。 不需要每个查询都返回所有列的事实是完全正常的;这就是为什么SELECT语句可让您显式命名所需的列的原因。 通常,您的表结构应反映您的域模型

  • 背景 jwt使用HS256加密方式 之前是采用uid+username+网站上线运行那一刻的毫秒数,但是因为在业务实现上有一定限制(无法保证每个业务(controller层)都获取的到user对象),故该方案已弃用 目前后端加盐为系统上线运行那一刻的毫秒数 但是感觉安全性比较低 问题 想问一下,在实际的开发场景下,大都如何设计加盐密钥?

  • 我不时会在logcat中看到类似的日志条目: 编舞跳过了35帧!应用程序可能在其主线程上做了太多工作。 我知道这条消息的含义(在这里进行了解释:Logcat中编舞消息的含义),这个问题不是关于消息的含义。 我的问题是:有多少跳过的帧太多?是否有任何指导(官方或经验)可以说50左右太多而更少是可以的?即使在速度较慢的设备上,我也没有看到任何性能下降。也许我真的不应该仅仅基于这个消息就担心性能?

  • 问题内容: 有人设置伪装的Maven存储库和/或IP流以提供伪装的原始但被注入恶意或有害代码的库副本的风险和可能性或场景是什么? 采取哪些步骤和措施来预防此类风险和可能性? 问题答案: 我想一个专门的,机智的攻击者可以执行一次MITM攻击,并拦截对公共Maven存储库的所有请求,然后将恶意字节码小心地注入JAR工件中,然后重新计算并提供SHA1哈希值。 对于客户端来说,它看起来像是合法的工件:二进

  • 我有一个auth-cas库,它为我的spring boot项目提供身份验证。在这个auth-cas库中,有一个类扩展并使用以下配置函数 由于这应该是黑框,所以我添加了自己的,如下所示: 我的自定义AuthenticationProvider实现了“AuthenticationProvider”,并在页面中工作,将我重定向到/login页面,我可以使用用户库中的凭据登录。唯一的问题是,当我已经登录到