5

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

谢谢

4

4 回答 4

28

SHA-512 是一种加密散列函数。加密散列函数是一种方法- 您可以计算数据块的散列,但是当您只有散列时无法取回原始数据。因此,您无法解密哈希码以取回原始数据。

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

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

于 2012-11-29T08:23:19.613 回答
4

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

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

于 2012-11-29T08:22:32.963 回答
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));

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

于 2012-11-29T08:23:01.747 回答
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));}}
于 2018-08-09T11:09:59.693 回答