我已经读过哈希密码正确需要使用" salt"这至少与最终散列密码的预期长度一样多。就我而言,我需要长度为64个字符的盐。
对于ASP.NET
和VB.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>
答案 0 :(得分:1)
salt由字节组成。这些字节可以用作例如输入。 the PBKDF2 function派生密码哈希。如果要将salt转换为字符,请使用base 64编码。请不要为此创建自己的方案。 8个字节大约是盐的最小大小,16个是充足的,64个是相当高的。