当前位置: 首页 > 面试题库 >

Java加密的字符串无法存储在数据库中

王才英
2023-03-14
问题内容

尝试使用javax.crypto库对字符串进行加密并将其存储在数据库(Oracle)中。稍后我将需要解密此字符串,因此我需要双向算法

问题是数据库似乎不接受该方法创建的某些加密字符。我们介于将数据库迁移到新服务器之间。旧数据库使用US7ASCII字符集,而新数据库使用AL32UTF8。当我将加密的字符串放入数据库中时,数据库只是将它们转换为US7ASCII数据库中的问号(?)。它似乎可以很好地存储在AL32UTF8数据库中。

因此,我必须使它相互兼容。在使用getBytes()方法时,我曾尝试向其发送不同的StandardCharsets值,但这似乎无济于事。也许我想念一些东西。我能以不同的方式获得预期的结果吗?

这是我的生成密文的代码。从StackOverflow上的另一篇文章修改

import java.io.PrintStream;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;

public class test
{

    public static void main(String[] args)
    throws Exception
    {
        //byte[] encryptionKey = "Es6XYPkgCV75J95Y".getBytes(StandardCharsets.UTF_8);
        byte[] encryptionKey = "Es6XYPkgCV75J95Y".getBytes(StandardCharsets.ISO_8859_1);
        //byte[] plainText = args[0].getBytes(StandardCharsets.UTF_8);
        byte[] plainText = args[0].getBytes(StandardCharsets.ISO_8859_1);
        MyCrypto aes = new MyCrypto(encryptionKey);
        byte[] cipherText = aes.encrypt(plainText);
        byte[] decryptedCipherText = aes.decrypt(cipherText);

        System.out.println(new String(plainText));
        System.out.println(new String(cipherText));
        System.out.println(new String(decryptedCipherText));
    }

}

class MyCrypto
{
    private byte[] key;

    private static final String ALGORITHM = "AES";

    public MyCrypto(byte[] key)
    {
        this.key = key;
    }

    /**
     * Encrypts the given plain text
     *
     * @param plainText The plain text to encrypt
     */
    public byte[] encrypt(byte[] plainText) throws Exception
    {
        SecretKeySpec secretKey = new SecretKeySpec(key, ALGORITHM);
        Cipher cipher = Cipher.getInstance(ALGORITHM);
        cipher.init(Cipher.ENCRYPT_MODE, secretKey);

        return cipher.doFinal(plainText);
    }

    /**
     * Decrypts the given byte array
     *
     * @param cipherText The data to decrypt
     */
    public byte[] decrypt(byte[] cipherText) throws Exception
    {
        SecretKeySpec secretKey = new SecretKeySpec(key, ALGORITHM);
        Cipher cipher = Cipher.getInstance(ALGORITHM);
        cipher.init(Cipher.DECRYPT_MODE, secretKey);

        return cipher.doFinal(cipherText);
    }
}

问题答案:

加密数据时,会将其转换为二进制数据。听起来您正在尝试将其存储为字符数据,这是一个坏主意。

您确实有两个选择;

  1. 使用二进制到文本方案(例如Base64)对加密的二进制数据进行编码。然后,您可以将编码后的数据存储为字符数据。当您要检索它时,您需要读取字符数据并解密(从文本到二进制),然后再解密。

  2. 将加密的二进制数据存储为二进制(例如,作为BLOB)。



 类似资料:
  • 我有一个通过ORM保存到数据库的对象。对象有一个字符串数组,每个对象的数组长度可以不同。我想知道在db中存储字符串数组的标准做法(例如,我是否应该将所有字符串存储在一个字段中作为csv等)?

  • 我需要符合HIPAA标准,这些要求表明AES256加密足以存储敏感数据(名字,姓氏,SSN,ID,DOB,电话,VIN等)。 我倾向于通过应用程序代码加密,而不是使用MSSQL或MySQL内置的加密字段支持。避免SQL签名证书过程,设置MASTER KEY等。 我研究AES256加密使用。NET 6,大多数人被警告不要使用AES - CBC、ECB、EFB或CTS...事实上,即使是微软自己的文档

  • 大家好,我用用算法'aes-256-cbc'用PHP加密了字符串 密钥: 向量:

  • 本文向大家介绍ASP.NET web.config中 数据库连接字符串加密解密,包括了ASP.NET web.config中 数据库连接字符串加密解密的使用技巧和注意事项,需要的朋友参考一下 虽然不怎么新鲜,但相信还是有许多人不知道,好,不说废话,直接给方法:开始--->运行,输入cmd,接着输入以下内容 加密: C:\WINDOWS\Microsoft.NET\Framework\v2.0.50

  • 问题内容: 我在我的iPhone应用程序中使用Objective C中的加密类,但是我在努力通过Android应用程序在JAVA中使用相同的功能。我的加密代码如下: 我试图在JAVA中复制它,但是当我编码相同的数据时却得到了不同的字符串。所以我做错了事,但我无法弄清楚。这是我的JAVA代码: 谁能看到我要去哪里错了? 根据以下注释,我添加了getBytes,但是生成的字符串仍然不同: 问题答案:

  • 问题内容: 我有一个webapp,它在MySQL数据库中存储法语文本(可能包含重音字符)。通过PHP直接检索数据时,带重音的字符变得乱码。例如: 因此,我使用(或)将字符串转换为html实体,一切都很好。但是,当我输出包含重音字符和HTML元素的数据时,事情变得更加复杂。例如,被转换为浏览器,因此浏览器无法理解。 如何同时正确显示重音字符和正确解析HTML? 谢谢! 问题答案: 也许你可以看看和