C# 如何在c中将SHA512哈希值解密为实际字符串#

C# 如何在c中将SHA512哈希值解密为实际字符串#,c#,encryption,C#,Encryption,我通过以下代码加密密码 HashAlgorithm hashAlgorithm = null; hashAlgorithm = new SHA512CryptoServiceProvider(); try { byte[] byteValue = Encoding.UTF8.GetBytes(source); byte[] hashValue = hashAlgorithm.ComputeHash(byteValue); StringBuilder sb = new

我通过以下代码加密密码

HashAlgorithm hashAlgorithm = null;
hashAlgorithm = new SHA512CryptoServiceProvider();
try 
{
    byte[] byteValue = Encoding.UTF8.GetBytes(source);
    byte[] hashValue = hashAlgorithm.ComputeHash(byteValue);

    StringBuilder sb = new StringBuilder();
    for (int i = 0; i <= hashValue.Length - 1; i++) 
    {
        sb.AppendFormat("{0:x2}", hashValue[i]);
    }

    return Convert.ToString(sb);
} 
catch 
{
    throw;
}
HashAlgorithm HashAlgorithm=null;
hashAlgorithm=新的SHA512CryptoServiceProvider();
尝试
{
byte[]byteValue=Encoding.UTF8.GetBytes(源);
byte[]hashValue=hashAlgorithm.ComputeHash(字节值);
StringBuilder sb=新的StringBuilder();

对于(int i=0;i你
散列了一个密码,而你不
加密它。也就是说你不能
解密它

取自

加密将数据转换为另一种格式,其方式只有 特定个体可以反转转换。它使用一个键, 与明文和 算法,以便执行加密操作 密文、算法和密钥都需要返回到 纯文本

散列的目的是确保完整性,即使其保持完整性 如果某件事改变了,你可以知道它已经改变了。 从技术上讲,散列接受任意输入并产生固定长度 具有以下属性的字符串:

  • 相同的输入将始终产生相同的输出
  • 多个不同的输入不应产生相同的输出
  • 不能从输出转到输入。
  • 对给定输入的任何修改都会导致哈希的剧烈变化
  • 散列用于 与身份验证相结合,以提供强有力的证据证明 给定的消息尚未修改。这是通过采取 给定的输入,用给定的密钥加密,散列,然后 使用收件人的公钥加密密钥并签名 具有发送方私钥的哈希


    那么我可以用什么把输出转换成输入呢

    你应该解密数据,而不是散列数据。加密和解密数据是一个大课题。阅读是一个很好的起点。通常,你有两种encryoption类型,对称和非对称。因此,首先,阅读它们,然后选择一种你认为适合你需要的。然后尝试实现它。你将使用算法已在.NET中实现的,可用于实例化相应类的对象并调用特定方法的

    但是,我必须在这里做一个说明。通常,我们对密码进行散列,而不加密。这更安全。摘自:

    虽然散列和加密都提供了宝贵的功能,但对于 在绝大多数情况下,只有一个正确的选择 为在线应用程序存储用户密码:散列。这是一个 单向函数,其中哈希值不能反转以获得 原始输入值(即密码)。对称加密是 基于使用加密密钥,是一种可逆操作。 任何拥有密钥的人都可以对加密值进行解密以获得密钥 原值


    你误解了肉馅的作用。请看一个聪明人说的话:“如何让活牛离开牛肉汉堡?”。另一个问题是,像SHA-2这样的普通加密散列不是密码散列所要做的。您想要的是一个缓慢的盐渍散列。有关详细信息,请参阅security.se。那么我可以使用什么将输出转换为输入?如果您认真问这个问题,请再次阅读此答案。否则,请使用google进行暴力或字典攻击。@NituBansal请查看我的更新。仅在阅读MSDN文档后实现安全对称加密实际上是不可能的。API的级别非常低,因此程序员需要实现几个陷阱,这需要相当多的加密知识。@CodesInChaos我100%同意你的意见。但是,这是一个起点,以便你不同意吗?