从数据库获取 KEY 时出现 java.security.InvalidKeyException : Unsupported key.

标签 java encryption

我已将 key 存储在数据库中并获取 key 进行加密, 我遇到异常

异常

java.security.InvalidKeyException: Unsupported key  Note: Key is not in encrypted format.
Fetched Key from DB de.flexiprovider.core.rijndael.RijndaelKey@c4ef71c9
invalid Key  javax.crypto.spec.SecretKeySpec@97d5a10e  // we can see here key is changed

计划

StringBuffer sbselect1=new StringBuffer();
sbselect1.append("SELECT Keyforkey FROM ");
sbselect1.append(UserConstants.USER_DETAILS_TABLE_NAME2);
sbselect1.append(" where ID=2");
ps1=conn.prepareStatement(sbselect1.toString());
ResultSet rs =ps1.executeQuery();
 rs.next();
String keyskey = rs.getString("KeyforKey");
System.out.println("Fetched Key from DB "+keyskey);
Security.addProvider(new FlexiCoreProvider());
Cipher cipher2 = Cipher.getInstance("AES128_CBC", "FlexiCore");
//  byte[] encodedKey =keyskey.getBytes();
SecretKey key2 = new SecretKeySpec(keyskey.getBytes(), 0,  keyskey.length(), "AES");
System.out.println("invalid Key  "+ key2);
rs.close(); 

这段代码我出错了

SecretKey key2 = new SecretKeySpec(keyskey.getBytes(), 0,  keyskey.length(), "AES");

并且还在 byte[]encodedKey =keyskey.getBytes();输出为 [B@117e4ff

请帮我解决问题。

最佳答案

如果我们需要人类可读的 key ,我们通常以十六进制或 Base64 字符串格式存储 key 。假设您将十六进制格式的 key 存储到数据库中,则不应使用 keyskey.getBytes() 获取字符串的字节,而是使用以下算法获取它们(取自 here与其他十六进制到字节的解决方案相比,它的工作速度相当快):

public static byte[] hexStringToByteArray(String s) {
    int len = s.length();
    byte[] data = new byte[len / 2];
    for (int i = 0; i < len; i += 2) {
        data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4)
                             + Character.digit(s.charAt(i+1), 16));
    }
    return data;
}

如果您使用 Base64 格式,请执行与上述类似的操作,请参阅 here .

关于从数据库获取 KEY 时出现 java.security.InvalidKeyException : Unsupported key.,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27752419/

相关文章:

Java 文件解析 - 逐字解析

java - 如何使用 Maven Central 确定哪个 Artifact 包含类?

java - 如果没有配置交易会出现异常吗?

java - 将类的静态变量重新初始化为它们的原始值java

c++ - 关于RSA加密的各种问题

java - 使用循环创建表行不起作用

java - 使用 javax.net.ssl.SSLContext 时禁用弱 ssl 密码

java - OpenSSL 和 Java 产生不同的 SHA256 RSA 签名

Java 字节到字符串给出奇怪的结果?

azure - 在 Gitlab 中加密 Terraform 值