如何解密SHA-256encryption的string?

我有一个string,使用下面的方法进行编码,有没有办法将这个string解码回原来的价值? 谢谢。

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是一种密码(单向)散列函数 ,所以没有直接的方法来解码它。 密码散列函数的全部目的是你不能撤消它。

你可以做的一件事是一个暴力的策略 ,你猜猜什么是散列,然后用相同的函数对它进行散列,看它是否匹配。 除非散列数据很容易猜到,否则可能需要很长时间

您可能会发现“ 散列密码和encryption之间的区别 ”这个问题很有意思。

需要注意的是,Sha256不会对string的数据/内容进行encryption,而是使用inputstring作为种子来生成固定大小的哈希。

在这种情况下,我可以input一个百科全书(encyclopedia)的内容,这个百科全书的大小只有100MB,但是结果string仍然是256位。

它不可能反转散列,为了从固定大小的散列返回100mb的数据,最好的办法是尝试猜测/计算种子数据,散列,然后查看散列是否与散列匹配你试图打破。

如果你可以颠倒这个散列,那么你将拥有迄今为止最好的压缩forms。

你用盐又名SSHA做了正确的事。

本身没有盐的SHA和SHA-2(或SHA-256)不再被认为是安全的! 将SHA哈希称为Salted SHA或SSHA。

下面是一个简单的例子,它是如何轻松地去散列SHA-1。 对于SHA-2也可以做同样的事情。

在这个URL中input一个密码: http : //www.xorbin.com/tools/sha1-hash-calculator复制粘贴哈希到这个URL: http : //www.hashkiller.co.uk/sha1-decrypter.aspx

这是一个去散列SHA-2的页面。 这个页面的工作方式是以前有人必须散列你的密码,否则就不会find它:md5hashing dot net / hashing / sha256

这里有一个页面,声称有完整的SHA-2表可供下载的“捐赠”(我还没有尝试过):crackstation点净/购买crackstation-wordlist-password-cracking-dictionary.htm

这里有一篇很好的文章解释了为什么你必须在SHA上使用SSHA:crackstation dot net / hashing-security.htm

SHA *是一个散列函数。 它创build原始数据的表示(哈希)。 这个散列永远不会被用来重新创build原始数据。 因此这不是encryption。 相同的哈希函数可以在同一原始数据的两个不同位置使用,以查看是否产生了相同的哈希。 这种方法通常用于密码validation。