1
我已经读过哈希密码,需要使用至少与最终散列密码的预期长度一样多的字符“salt”。就我而言,我需要长达64个字符的盐。使用RNGCryptoServiceProvider通过密码保护伪随机数生成盐
对于ASP.NET
和VB.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>
我强烈建议不要试图实现自己的安全加密代码,除非你知道你在做什么。通读这一点,然后看看他们已经发布的代码:https://crackstation.net/hashing-security.htm#aspsourcecode – womp
@womp - 谢谢,我已经看过你提到的代码,而且这篇文章很做得好。我已经从c#转换到vb.net,它运行平稳。 – GWR