Java 如何使用salt解密SHA-512哈希代码?
我用sha-512 Algo及其salt加密了数据,我想解密 请告诉我如何使用Java解码这些数据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不是加密。散列一种算法,设计为仅单向,用于验证数据的完整性
简而言之:不,您不能对任何哈希算法进行“解密”。您可以让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位的输入都可能产生冲突。维基百科引文中这一专栏的意思是,在特定的实验中没有观察到碰撞。