Java 如何使用salt解密SHA-512哈希代码?

Java 如何使用salt解密SHA-512哈希代码?,java,encryption,Java,Encryption,我用sha-512 Algo及其salt加密了数据,我想解密 请告诉我如何使用Java解码这些数据 谢谢SHa 512不是加密。散列一种算法,设计为仅单向,用于验证数据的完整性 简而言之:不,您不能对任何哈希算法进行“解密”。您可以让Java使用MessageDigest类计算哈希 String plainText = "text" + "salt"; MessageDigest messageDigest = MessageDigest.getInstance("SHA-512"); byt

我用sha-512 Algo及其salt加密了数据,我想解密 请告诉我如何使用Java解码这些数据


谢谢

SHa 512不是加密。散列一种算法,设计为仅单向,用于验证数据的完整性


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

您可以让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));
如果知道可能的明文值,可以找到匹配的哈希。然而,如果你对原始数据没有任何线索的话,暴力强迫这将基本上持续到世界末日。

SHA-512是一个很好的例子。加密散列函数是单向的——您可以计算数据块的散列,但当您只有散列时,无法获取原始数据。因此,您无法解密哈希代码以获取原始数据

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


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

如何实现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));}}

SHA-512是散列函数,不是加密函数。它被设计成“单向”——换句话说,一旦你对某个东西进行了SHA-512散列,它就不能被“取消散列”。嗨,乌托邦天堂,我知道如何加密,但告诉我如何解密加密的数据,thnks@Narendra你看过其他答案了吗?这是不可能的,因为它不是加密。这里显示的是蛮力裂解,这可能需要很长时间。当然,它有碰撞。这是一个散列函数。任何超过512位的输入都可能产生冲突。维基百科引文中这一专栏的意思是,在特定的实验中没有观察到碰撞。