用blowfish Java加密后无法解密

时间:2013-11-09 16:20:55

标签: java encryption

您好我是Java的新手,我有以下问题:我正在尝试使用blowfish算法加密用户的密码,但是当我尝试将其解密回来检查身份验证时,它无法解密它出于某种原因。

public static String encryptBlowFish(String to_encrypt, String salt){
    String dbpassword = null;
    try{
        SecretKeySpec skeySpec = new SecretKeySpec( salt.getBytes(), "Blowfish" );

        // Instantiate the cipher.
        Cipher cipher = Cipher.getInstance("Blowfish/CBC/PKCS5Padding");
        cipher.init(Cipher.ENCRYPT_MODE, skeySpec);

        //byte[] encrypted = cipher.doFinal( URLEncoder.encode(data).getBytes() );
        byte[] encrypted = cipher.doFinal( to_encrypt.getBytes() );
        dbpassword = new String(encrypted);
    } catch (Exception e) {
        System.out.println("Exception while encrypting");
        e.printStackTrace();
         dbpassword = null;
    } finally {
        return  dbpassword;
    }
}

public static String decryptBlowFish(String to_decrypt, String salt){
    String dbpassword = null;
    try{
        SecretKeySpec skeySpec = new SecretKeySpec( salt.getBytes(), "Blowfish" );

        // Instantiate the cipher.
        Cipher cipher = Cipher.getInstance("Blowfish/CBC/PKCS5Padding");
        cipher.init(Cipher.DECRYPT_MODE, skeySpec);

        //byte[] encrypted = cipher.doFinal( URLEncoder.encode(data).getBytes() );
        byte[] encrypted = cipher.doFinal( to_decrypt.getBytes() );
        dbpassword = new String(encrypted);
    } catch (Exception e) {
        System.out.println("Exception while decrypting");
        e.printStackTrace();
        dbpassword = null;
    } finally {
        return  dbpassword;
    }
}

当我调用decrypt函数时,它给出了以下错误: java.security.InvalidKeyException:缺少参数

有什么想法吗?谢谢

1 个答案:

答案 0 :(得分:2)

你在这里犯了很多错误:

  • 您正在将加密值转换为字符串。并非所有字节都是有效字符串。将字节直接存储在数据库中作为二进制blob,而不是字符串(或首先将其转换为十六进制或base64)。

  • 你混淆盐和钥匙。你在代码中调用salt的东西实际上是私钥。你根本没有真正的盐。

  • 您正在加密密码。这意味着您需要在某个地方存储密钥(您无法将其存储在数据库中,或者任何窃取数据库的人都可以解密密码)。相反,你应该使用哈希。

  • 即使这样,你也不应该以这种方式存储密码。即使你正确使用盐也没有。如今,即使在盐渍的情况下,也很容易破解简单的哈希密码。相反,使用bcrypt库或PBKDF2。

here are instructions for doing this correctly。请注意,如果您按照这些说明进行操作, 可以将密码存储为字符串(它已经为您正确转换)。