【发布时间】:2016-02-08 05:30:28
【问题描述】:
我已阅读正确散列密码需要使用“盐”,该盐至少与最终散列密码的预期长度一样多。就我而言,我需要 64 个字符长的盐。
对于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() = "!@@$%^^*()_-+=[{]};:>|./?".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