2015-11-06 70 views
1

我已经读过哈希密码,需要使用至少与最终散列密码的预期长度一样多的字符“salt”。就我而言,我需要长达64个字符的盐。使用RNGCryptoServiceProvider通过密码保护伪随机数生成盐

对于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() = "[email protected]@$%^^*()_-+=[{]};:>|./?".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

我强烈建议不要试图实现自己的安全加密代码,除非你知道你在做什么。通读这一点,然后看看他们已经发布的代码:https://crackstation.net/hashing-security.htm#aspsourcecode – womp

+0

@womp - 谢谢,我已经看过你提到的代码,而且这篇文章很做得好。我已经从c#转换到vb.net,它运行平稳。 – GWR

回答

1

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