【问题标题】:How can I decrypt SHA-512 hash code using salt?如何使用盐解密 SHA-512 哈希码?
【发布时间】:2012-11-29 08:12:09
【问题描述】:

我已使用 sha-512 Algo 及其 salt 加密数据,我想解密 该数据请任何人告诉我如何使用 Java 对其进行解码。

谢谢

【问题讨论】:

  • SHA-512 是哈希函数,不是加密函数。它被设计为“单向”——换句话说,一旦你对某些东西进行 SHA-512 哈希处理,它就不能被“取消哈希处理”。

标签: java encryption


【解决方案1】:

SHA-512 是 cryptographic hash function。加密散列函数是一种方式 - 您可以计算数据块的散列,但如果只有散列,则无法取回原始数据。所以你不能解密一个哈希码来取回原始数据。

加密散列函数通常用于在数据库中存储密码。要检查用户输入的密码是否正确,您可能首先想到的是“好的,所以我必须解密数据库中的密码并检查它是否与用户输入的密码相同”。然而,这不是你如何做到这一点的。

相反,您所做的是对用户输入的密码进行哈希处理,并将该哈希值与存储在数据库中的哈希值进行比较。如果哈希值相同,则用户输入了正确的密码。您不需要“解密”哈希。

【讨论】:

    【解决方案2】:

    SHA 512 不是加密。散列一种算法,该算法旨在仅以一种方式验证数据的完整性。

    简而言之:不,您不能“解密”任何哈希算法。

    【讨论】:

    • 当然有碰撞。这是一个哈希函数。任何超过 512 位的输入都容易产生冲突。您的 Wikipedia 引用中的列的含义是在特定实验中未观察到任何碰撞。
    【解决方案3】:

    您可以让 Java 使用 MessageDigest 类计算哈希。

    String plainText = "text" + "salt";
    
    MessageDigest messageDigest = MessageDigest.getInstance("SHA-512");
    byte[] hash = messageDigest.digest( plainText.getBytes() );
    
    System.out.println("Result: " + new String(hash));
    

    如果您知道可能的纯文本值,则可以找到匹配的哈希值。但是,如果您对原始数据一无所知,那么暴力破解基本上会持续到世界末日。

    【讨论】:

    • 嗨,utopianheaven 我知道如何加密,但请告诉我如何解密加密数据,谢谢
    • @Narendra 你读过其他答案了吗?这是不可能的,因为它不是加密。这里显示的是蛮力破解,这可能需要很长时间。
    【解决方案4】:

    如何用 SHA512 代替 MD5

    这里是MD5代码

    public class RijndaelSimple
    {
        public static string Decrypt
        (
            string cipherText,
            string passPhrase,
            string saltValue,
            string hashAlgorithm,
            int passwordIterations,
            string initVector,
            int keySize
        )
        {
    
            byte[] initVectorBytes = Encoding.ASCII.GetBytes(initVector);
            byte[] saltValueBytes = Encoding.ASCII.GetBytes(saltValue);
    
            byte[] cipherTextBytes = Convert.FromBase64String(cipherText);
    
            PasswordDeriveBytes password = new PasswordDeriveBytes
            (
                passPhrase,
                saltValueBytes,
                hashAlgorithm,
                passwordIterations
            );
    
            byte[] keyBytes = password.GetBytes(keySize / 8);
            RijndaelManaged symmetricKey = new RijndaelManaged();
    
            symmetricKey.Mode = CipherMode.CBC;
    
    
            ICryptoTransform decryptor = symmetricKey.CreateDecryptor
            (
                keyBytes,
                initVectorBytes
            );
    
    
            MemoryStream memoryStream = new MemoryStream(cipherTextBytes);
    
    
            CryptoStream cryptoStream = new CryptoStream
            (
                memoryStream,
                decryptor,
                CryptoStreamMode.Read
            );
    
            byte[] plainTextBytes = new byte[cipherTextBytes.Length];
    
    
            int decryptedByteCount = cryptoStream.Read
            (
                plainTextBytes,
                0,
                plainTextBytes.Length
            );
    
            memoryStream.Close();
            cryptoStream.Close();
    
            string plainText = Encoding.UTF8.GetString
            (
                plainTextBytes,
                0,
                decryptedByteCount
            );
    
            return plainText;
        }
    }
    
    public class RijndaelSimpleTest
    {
    
        [STAThread]
        static void Main(string[] args)
        {
            string plainText = "Hello, World!";    // original plaintext
    
            string passPhrase = "Pas5pr@se";        // can be any string
            string saltValue = "kplcs@1tValue";        // can be any string
            string hashAlgorithm = "SHA1";             // can be "MD5"
            int passwordIterations = 2;               // can be any number
            string initVector = "@1B2c3D4e5F6g7H8"; // must be 16 bytes
            int keySize = 256;                // can be 192 or 128
    
            Console.WriteLine(String.Format("Plaintext : {0}", plainText));
    
            string cipherText = RijndaelSimple.Encrypt
            (
                plainText,
                passPhrase,
                saltValue,
                hashAlgorithm,
                passwordIterations,
                initVector,
                keySize
            );
    
            Console.WriteLine(String.Format("Encrypted : {0}", cipherText));
    
            plainText = RijndaelSimple.Decrypt
            (
                cipherText,
                passPhrase,
                saltValue,
                hashAlgorithm,
                passwordIterations,
                initVector,
                keySize
            );
    
            Console.WriteLine(String.Format("Decrypted : {0}", plainText));}}
    

    【讨论】:

      猜你喜欢
      • 2015-10-23
      • 2014-05-12
      • 2014-11-11
      • 2013-04-26
      • 1970-01-01
      • 2016-01-10
      • 2018-03-12
      • 1970-01-01
      • 2013-09-11
      相关资源
      最近更新 更多