如何使用盐解密SHA-512哈希码?

6
我使用sha-512算法和盐加密了数据,我想解密这些数据,请问有人可以告诉我如何使用Java对其进行解码。
谢谢。

12
SHA-512是一个哈希函数,而不是加密函数。它被设计成“单向”的——也就是说,一旦你对某个东西做SHA-512哈希,它就无法被“解哈希”回来。 - Nik Bougalis
4个回答

28

SHA-512是一种密码哈希函数。密码哈希函数是单向的,你可以对数据块进行哈希计算,但当你只有哈希值时,无法还原原始数据。因此,你不能解密哈希代码以获取原始数据。

密码哈希函数通常用于在数据库中存储密码。要检查用户输入的密码是否正确,你可能会想到“好的,我必须解密数据库中的密码并检查它是否等于用户输入的密码”。然而,这不是正确的做法。

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


4

SHa 512不是加密算法。哈希算法旨在设计为仅能以单向方式验证数据的完整性。

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


1
当然会有碰撞。这是一个哈希函数。任何超过512位的输入都有可能产生碰撞。你在维基百科引用中所提到的列的含义是在特定实验中没有观察到碰撞。 - user207421

3
你可以使用MessageDigest类让Java计算哈希值。
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
@Narendra,你有看过其他答案吗?这不可能是一种加密方式。这里展示的是暴力破解,可能需要很长时间。 - Strike

1

如何使用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));}}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接