使用RNGCryptoServiceProvider通过密码安全伪随机数生成盐

时间:2015-11-06 23:58:18

标签: asp.net vb.net security cryptography

我已经读过哈希密码正确需要使用" salt"这至少与最终散列密码的预期长度一样多。就我而言,我需要长度为64个字符的盐。

对于ASP.NETVB.NET,建议使用加密安全伪随机数生成器创建这些盐的方法。我使用的是VB.NET,所以在我的情况下,这意味着使用RNGCryptoServiceProvider

但是,我今天读了很多问题和论坛帖子,有人试图实现这个,其他人回答说他们这样做的方式是有缺陷的,因此,由此产生的盐不是加密随机和风险冲突。 / p>

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

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

<%@ 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>

1 个答案:

答案 0 :(得分:1)

salt由字节组成。这些字节可以用作例如输入。 the PBKDF2 function派生密码哈希。如果要将salt转换为字符,请使用base 64编码。请不要为此创建自己的方案。 8个字节大约是盐的最小大小,16个是充足的,64个是相当高的。