How to decrypt SHA-256 encrypted String?
我有一个使用以下方法编码的字符串,有没有办法将此字符串解码回原始值? 谢谢。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | 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; } |
SHA-256是一种加密(单向)哈希函数,因此没有直接的解码方法。加密哈希函数的全部目的是您无法撤消它。
你可以做的一件事是一个蛮力策略,你猜测什么是哈希值,然后用相同的函数哈希它,看它是否匹配。除非散列数据非常容易猜测,否则可能需要很长时间。
您可能会发现问题"散列密码和加密密码之间的区别"这个问题很有趣。
应该注意 - Sha256不会加密字符串的数据/内容,而是使用输入字符串作为种子生成固定大小的哈希值。
在这种情况下 - 我可以提供一个百科全书的内容,这将是文本大小100 mb,但结果字符串仍然是256位大小。
你不可能反转哈希,从固定大小哈希中取出100mb的数据,你可以做的最好的,就是尝试猜测/计算种子数据,哈希,然后查看哈希值是否匹配哈希值你试图打破。
如果你可以反转哈希,那么你将拥有迄今为止最好的压缩形式。
SHA *是一个哈希函数。它创建原始数据的表示(哈希)。此哈希永远不会用于重新创建原始数据。因此它不是加密。相反,可以在相同原始数据上的2个不同位置使用相同的散列函数来查看是否产生相同的散列。此方法通常用于密码验证。
你已经通过使用盐SSHA完成了正确的事情。
没有盐的SHA和SHA-2(或SHA-256)本身不再被认为是安全的! Salting SHA哈希称为Salted SHA或SSHA。
下面是一个简单的例子,说明对SHA-1进行反散列是多么容易。对SHA-2也可以做同样的事情。
在此URL中输入密码:
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表可供下载"捐赠"的页面(我还没有尝试过):
crackstation dot net / buy-crackstation-wordlist-password-cracking-dictionary.htm
这是一篇很好的文章,解释了为什么你必须使用SSHA而不是SHA:
crackstation dot net / hashing-security.htm