检索解密数据时出现问题

时间:2010-07-06 14:33:15

标签: java ms-access encryption

我正在研究加密 - 解密程序。 程序从用户获取输入并加密。然后它将加密数据存储在ms访问数据库表中。 之后,从表中检索数据,解密并返回给用户。

我将数据作为文本存储在ms访问中。加密算法返回大小为16的字节数组。 但是当我从数据库中检索数据时,我只得到一个大小为8的字节数组。 帮助我完成这个......

3 个答案:

答案 0 :(得分:2)

我认为问题在于你将它用作文本而不是它(它是二进制数据)。长度减半听起来像是一个与Unicode相关的问题(即'text'存储为宽字,有两个字节用于字符,但每个字符检索为一个字节)。

答案 1 :(得分:0)

一种可能的解决方案是使用Base64编码

将密文编码为String

您可以使用Appache Commons Library: http://commons.apache.org/codec/apidocs/org/apache/commons/codec/binary/Base64.html

<强>被修改: 我不知道为什么你想要MS-ACCESS特定的解决方案! DMBS可能会改变,操作系统也可能会发生变化..你必须编写可以在很多情况下工作的通用解决方案..

这里使用Base64编码器/解码器的小例子:

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder; 

import java.io.IOException ;

public class Decoder {
    public static void main(String[] args) throws IOException{
        byte[] cipherBytes = "stackoverflow".getBytes();    // say this the is encrypted bytes

        String encodedBytes = new BASE64Encoder().encode(cipherBytes);
        System.out.println("stored as: " + encodedBytes );

        byte[] decodedBytes = new BASE64Decoder().decodeBuffer(encodedBytes); 
        System.out.println("extracted as: " + new String(decodedBytes) );
    }
}

注意:此代码使用内部Sun类(BASE64Encoder / Decoder),不建议在程序中使用这些类,因为它可能会在下一版本的JDK中更改。

在Appache Commons中使用BASE64编码器/解码器更好。

如果您需要MS-ACCESS解决方案,请尝试将密文存储在LONGBINARY中,请参阅: How to specify blob type in MS Access?

答案 2 :(得分:0)

我有一个应用程序,使用MS Crypto界面存储加密的信用卡号码。我从MS知识库获得了代码,关键是在适当的位置运行ByteToString()和StringToByte()转换。我将实际数据存储在普通Jet文本字段中,并且没有任何问题。