首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >java加密字符串不能存储在DB中

java加密字符串不能存储在DB中
EN

Stack Overflow用户
提问于 2017-06-19 19:42:01
回答 1查看 1.1K关注 0票数 2

尝试使用javax.crypto库加密字符串并将其存储在数据库(Oracle)中。稍后我需要解密这个字符串,所以我需要一个双向算法。

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

所以,我得让这个交叉兼容。在使用StandardCharsets ()方法时,我尝试过发送不同的getBytes值,但这似乎没有帮助。也许我漏掉了什么。有什么办法可以让我得到想要的结果吗?

这是我生成密码文本的代码。从StackOverflow上的另一篇文章中模式化

代码语言:javascript
复制
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);
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-06-19 19:58:15

当您加密数据时,您正在将其转换为二进制数据。听起来你想把它存储成字符数据,这是个坏主意。

你真的有两个选择;

  1. 使用二进制到文本方案(如Base64 )对加密的二进制数据进行编码。然后,可以将编码的数据存储为字符数据。当您想要检索它时,您需要在解密之前读取字符数据和解码(文本到二进制)。
  2. 将加密的二进制数据存储为二进制(例如BLOB)。
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44638656

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档