【问题标题】:Generating Salts Via Cryptographically Secure Pseudo-Random Numbers Using RNGCryptoServiceProvider使用 RNGCryptoServiceProvider 通过加密安全的伪随机数生成盐
【发布时间】:2016-02-08 05:30:28
【问题描述】:

我已阅读正确散列密码需要使用“盐”,该盐至少与最终散列密码的预期长度一样多。就我而言,我需要 64 个字符长的盐。

对于ASP.NETVB.NET,推荐使用加密安全伪随机数生成器创建这些盐的方法。我使用的是 VB.NET,所以就我而言,这意味着使用 RNGCryptoServiceProvider

但是,我今天阅读了很多问题和论坛帖子,其中有人试图实现这一点,而其他人则回应说他们这样做的方式存在缺陷,因此产生的盐不是加密随机的,并且存在冲突风险。

我想出了这段代码来生成盐,我的问题是:

这是否以生成加密安全盐的方式实现?

<%@ Page Debug="false" %>
<%@ Import Namespace="System.Security.Cryptography" %>

<script language="VB" runat="server">

Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)

    Dim iCharLength As Integer = 64
    Dim i As Integer
    Dim nonANcount As Integer = 0
    Dim buffer1 As Byte() = New Byte(iCharLength - 1) {}
    Dim sSalt As Char() = New Char(iCharLength - 1) {} 'contains the salts's characters as it's built up
    Dim sPunctuations As Char() = "!@@$%^^*()_-+=[{]};:>|./?".ToCharArray()
    Dim rng As New System.Security.Cryptography.RNGCryptoServiceProvider

    rng.GetBytes(buffer1) 'get a cryptographically strong series of bytes

    For i = 0 To iCharLength - 1
        'convert each byte into its representative character
        Dim rndChr As Integer = (buffer1(i) Mod 87)
        If (rndChr < 10) Then
            sSalt(i) = Convert.ToChar(Convert.ToUInt16(48 + rndChr))
        Else
            If (rndChr < 36) Then
                sSalt(i) = Convert.ToChar(Convert.ToUInt16((65 + rndChr) - 10))
            Else
                If (rndChr < 62) Then
                    sSalt(i) = Convert.ToChar(Convert.ToUInt16((97 + rndChr) - 36))
                Else
                    sSalt(i) = sPunctuations(rndChr - 62)
                    nonANcount += 1
                End If
            End If
        End If
    Next

    Response.Write("<pre>" & sSalt & "</pre>")

End Sub

</script>

【问题讨论】:

  • 我强烈建议不要尝试实现自己的安全加密代码,除非您知道自己在做什么。通读此文,然后查看他们发布的代码:crackstation.net/hashing-security.htm#aspsourcecode
  • @womp - 谢谢,我查看了您提到的代码,以及文章,它做得很好。我已经将它从 c# 转换为 vb.net 并且运行顺利。

标签: asp.net vb.net security cryptography


【解决方案1】:

盐由字节组成。这些字节可以用作例如输入。 the PBKDF2 function 派生密码哈希。如果要将盐转换为字符,请使用 base 64 编码。请不要为此创建自己的方案。 8 字节大约是盐的最小大小,16 已经足够了,而 64 则超过了顶部。

【讨论】:

    猜你喜欢
    • 2015-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多