我使用此函数来编码输入:
Public Function encodeStrings(ByVal MyPass As String, ByVal MyUName As String) As String
Dim ENPass As String = Nothing
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)
Return ENPass
End Function
现在我需要解码这个变量并取回原始字符串。
有谁知道怎么做?我在我的项目中使用VB.NET。
答案 0 :(得分:3)
不,没有办法解码它。 SHA1CryptoServiceProvider
实现了hashing algorithm。根据{{3}}:
计算输入数据的SHA1哈希值...
根据定义,SHA-1是一种散列算法。根据{{3}}:
在密码学中,SHA-1是由美国国家安全局设计并由美国NIST作为美国联邦信息处理标准发布的加密哈希函数。 SHA-1产生160位(20字节)哈希值。 SHA-1哈希值通常表示为十六进制数,长度为40位。
这就是为什么它继承自MSDN基类而不是Wikipedia article基类。由于它使用散列算法,这意味着它是单向编码的。原始字符串将始终产生相同的加密值,但无法解密它以恢复原始值,因为许多不同的字符串可能会导致相同的加密值(尽管使用HashAlgorithm
,作为SHA1,这是不可行的)。
如果你考虑一下,那是唯一有意义的事情。如果SHA-1算法总是产生20字节长的哈希码,那么这意味着你可以编码1千兆字节的字符串,它仍然只有20字节长作为SHA-1加密的哈希值。当然,您不认为这20个字节包含最初存储在该1 GB字符串中的所有数据。如果是这种情况,压缩文件将远更有效:)
通常,当使用加密哈希算法时,它将用于存储密码。在这种情况下,问题不在于如何解密密码,而是加密新输入的密码,然后比较两个加密值以查看它们是否相同。如果两个加密值相同,则表示用户输入了正确的密码。如果两个加密值不相同,那么您知道它是不正确的(但您仍然不知道正确的密码是什么)。
如果您需要双向加密算法,则需要使用继承自SymmetricAlgorithm
的算法,例如SymmetricAlgorithm
类。