我有一个使用以下方法编码的字符串,有没有办法将此字符串解码回其原始值?感谢。
public synchronized String encode(String password)
throws NoSuchAlgorithmException, IOException {
String encodedPassword = null;
byte[] salt = base64ToByte(saltChars);
MessageDigest digest = MessageDigest.getInstance("SHA-256");
digest.reset();
digest.update(salt);
byte[] btPass = digest.digest(password.getBytes("UTF-8"));
for (int i = 0; i < ITERATION_COUNT; i++) {
digest.reset();
btPass = digest.digest(btPass);
}
encodedPassword = byteToBase64(btPass);
return encodedPassword;
}
private byte[] base64ToByte(String str) throws IOException {
BASE64Decoder decoder = new BASE64Decoder();
byte[] returnbyteArray = decoder.decodeBuffer(str);
return returnbyteArray;
}
private String byteToBase64(byte[] bt) {
BASE64Encoder endecoder = new BASE64Encoder();
String returnString = endecoder.encode(bt);
return returnString;
}
答案 0 :(得分:115)
SHA-256是cryptographic (one-way) hash function,所以没有直接解码方法。加密哈希函数的全部目的是您无法撤消它。
你可以做的一件事是brute-force strategy,你可以猜测什么是哈希值,然后使用相同的函数对其进行哈希,看它是否匹配。除非散列数据非常容易猜测,否则可能需要长时间。
您可能会发现问题“Difference between hashing a password and encrypting it”很有趣。
答案 1 :(得分:31)
应该注意 - Sha256不会对字符串的数据/内容进行加密,而是使用输入字符串作为种子生成固定大小的哈希值。
就是这种情况 - 我可以提供一个百科全书的内容,这个内容的文本大小可以达到100 MB,但结果字符串的大小仍然是256位。
你不可能反转哈希,从固定大小哈希中取出100mb的数据,你能做的最好的,就是尝试猜测/计算种子数据,哈希,然后查看是否哈希匹配你试图破解的哈希。
如果您可以反转哈希值,那么到目前为止,您将拥有最佳的压缩形式。
答案 2 :(得分:3)
你使用盐SSHA做了正确的事。
SHA和SHA-2(或SHA-256)本身没有盐,不再被认为是安全的! Salting SHA哈希称为Salted SHA或SSHA。
下面是一个简单的示例,说明对SHA-1进行反散列是多么容易。对SHA-2也可以做同样的事情。
在此网址中输入密码: http://www.xorbin.com/tools/sha1-hash-calculator 将哈希复制粘贴到此URL中: http://www.hashkiller.co.uk/sha1-decrypter.aspx
这是一个解析SHA-2的页面。这个页面的工作方式是有人必须先密码你的密码,否则它不会找到它: md5hashing dot net / hashing / sha256
这是一个声称拥有完整的SHA-2表格的页面,可以下载#34;捐赠&#34; (我还没有尝试过): crackstation dot net / buy-crackstation-wordlist-password-cracking-dictionary.htm
这是一篇很好的文章,解释了为什么你必须使用SSHA而不是SHA: crackstation dot net / hashing-security.htm
答案 3 :(得分:3)
SHA *是一个哈希函数。它创建原始数据的表示(哈希)。此哈希永远不会用于重新创建原始数据。因此它不是加密。相反,可以在相同原始数据上的2个不同位置使用相同的散列函数来查看是否产生相同的散列。此方法通常用于密码验证。