0

您好,我是 Java 新手,我遇到以下问题:我正在尝试使用河豚算法加密用户的密码,但是当我尝试将其解密以检查身份验证时,由于某种原因无法解密.

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;
    }
}

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

有任何想法吗?谢谢

4

1 回答 1

2

你在这里做错了很多事情:

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

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

  • 您正在加密密码。这意味着您需要将密钥存储在某处(您不能将其存储在数据库中,否则任何窃取数据库的人都可以解密密码)。相反,您应该使用哈希。

  • 即使那样,您也不应该以这种方式存储密码。即使您正确使用盐也不会。如今,破解简单的散列密码太容易了,即使是加盐的。相反,请使用 bcrypt 库或 PBKDF2。

以下是正确执行此操作的说明。请注意,如果您按照这些说明操作,可以将密码存储为字符串(已为您正确转换)。

于 2013-11-09T20:19:07.133 回答