【问题标题】:Decrypt SHA encrypted string [duplicate]解密SHA加密字符串[重复]
【发布时间】:2013-04-20 08:16:27
【问题描述】:

我已经使用上面的代码加密了一个字符串。

public String encrypt(String generatedKey)
    {
            try {
                MessageDigest md = MessageDigest.getInstance("SHA");
                md.update(generatedKey.getBytes("UTF-8"));
                byte digest[] = md.digest();
                return (new BASE64Encoder()).encode(digest);
            }
            catch (Exception e) {
                return null;
            }

    }

同样,我需要一个代码来解密上面生成的代码。我该怎么做?

【问题讨论】:

  • 猜测许多可能的输入,并希望其中一个正确。
  • 我已经非常彻底地回答了这个问题here

标签: java encryption sha


【解决方案1】:

我很确定我们不能直接解码 SHA 加密字符串。

请参阅此以获得清晰的解释:How to decrypt SHA-256 encrypted String?

【讨论】:

    【解决方案2】:

    SHA 是一种摘要算法,而不是加密算法。摘要值不可解密。这就是为什么它们是安全的。两个不同的输入可能会给出相同的摘要值。但这种可能性很小。对于 sha256,它是 1/(2^256)。

    摘要算法的输出具有恒定长度。对于 SHA256,它始终是 256 位,无论您的输入长度是 1 位还是 100 Gbs。如果我们可以解密 256 位摘要值并返回原始 1Gb 输入,我们将永远不需要压缩算法 :)

    【讨论】:

      【解决方案3】:

      消息摘要会产生大量数据的小“指纹”。这是一个单向程序。

      您可能正在寻找的是加密。

      Key key = new SecretKeySpec(secret.getBytes(), ALGORITHM);
      
      // Encrypt
      Cipher cipher = Cipher.getInstance(ALGORITHM);
      cipher.init(Cipher.ENCRYPT_MODE, key);
      byte[] encryptedData = cipher.doFinal(plainText);
      
      // Decrypt
      cipher.init(Cipher.DECRYPT_MODE, key)
      byte[] decryptedData = cipher.doFinal(encryptedData);
      

      算法可以是其中之一 http://docs.oracle.com/javase/6/docs/technotes/guides/security/StandardNames.html#Cipher

      【讨论】:

      • 使用 AES-CBC 或 AES-CTR 进行加密,除非你有充分的理由使用其他东西。
      猜你喜欢
      • 2012-03-08
      • 1970-01-01
      • 1970-01-01
      • 2012-07-01
      • 2018-08-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多