检索解密数据时出现问题

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

我将数据存储为ms访问中的文本。 加密算法返回一个大小为16的字节数组。但是当我从数据库中检索数据时,我得到一个大小为8的字节数组。 帮我解决这个问题……

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

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

一种可能的解决方案是使用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中,请参阅: 如何在MS Access中指定blob类型?