2

我已经用这个代码转换了“密码”输入

Dim password As String = (MyPass + MyUName)
    Dim mhash As HashAlgorithm = New SHA1CryptoServiceProvider
    Dim bytValue() As Byte = System.Text.Encoding.UTF8.GetBytes(password)
    Dim bytHash() As Byte = mhash.ComputeHash(bytValue)
    mhash.Clear()
    ENPass = Convert.ToBase64String(bytHash)

使用此代码,我将取回一个与 bytHash 相同的字节数组

Dim Text As String = Convert.ToString(OfficeCommsRecs(5))
    Dim oReturn As New StringBuilder
    Dim Separator As String = ("")
    For Each Character As Byte In ASCIIEncoding.ASCII.GetBytes(Text)
        oReturn.Append(Convert.ToString(Character, 2).PadLeft(8, "1"))
        oReturn.Append(Separator)
    Next
    Dim myPass As Object = oReturn

我该怎么做才能取回密码?

4

3 回答 3

2

ASCIIEncoding.ASCII.GetBytes(Text)给你一个字节数组。直接在您的数据访问代码中使用它,作为SqlParameter.

您不需要您在问题中发布的其余代码:它只创建字节数组的人类可读表示,但数据库不理解这一点。它需要 a Byte(),而不是 a String

更新

我刚刚意识到我是个傻瓜——我一直在思考技术问题(保存/加载二进制数据)并错过了大局:你不应该读回密码。因此,散列是正确的方法,但请在阅读这篇文章时查看这篇精彩的文章:http: //codahale.com/how-to-safely-store-a-password/

于 2013-04-07T19:22:06.053 回答
1

如果您使用的是存储过程,则在存储数据之前传递字符串并使用 sql 的转换函数,如 Convert(binary,)。

于 2013-04-07T19:07:35.880 回答
0

查找以下以二进制格式插入字符串的示例:

---创建表

创建表测试(密码二进制(1000))

---为插入值创建过程

创建 Proc InsertValue @password nvarchar(200) 作为插入测试(密码)值(转换(二进制,@密码))

--插入值

执行插入值“新密码”

-----获取二进制数据和转换后的数据

从测试中选择密码,转换(nvarchar(200),密码)密码

于 2013-04-08T17:38:16.380 回答