【问题标题】:Problem in retrieving a decrypted data检索解密数据时出现问题
【发布时间】:2011-03-12 08:35:54
【问题描述】:

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

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

【问题讨论】:

  • 您使用的是 MS Crypto API、自创方法还是从网页复制的算法?
  • @ur384636:忘记 MS Crypto API,您可以通过将密码字节转换为字符串并将结果字符串存储在 DB 中的字符串中来解决您的问题。当您需要密文时,从 DB 中读取字符串,然后将其转换为字节。要使用许多方法执行从字符串到字节以及从字节到字符串的转换,其中之一是使用 BASE64 编码器/解码器,请参阅我的答案中的示例:stackoverflow.com/questions/3187166/… 其他方式将字节存储在“二进制字段”中DB,另请参阅我的答案,

标签: java ms-access encryption


【解决方案1】:

一种可能的解决方案是使用Base64 编码将密文编码为字符串

您可以为此使用 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?

【讨论】:

  • 注意他的标签。如何在 MS Access 中使用它?
  • 如果您阅读了 wiki 文章:“base64 通过对二进制数据进行数字处理来编码二进制数据”,您想存储二进制数据吗?有很多选择,第一个是将二进制存储在“二进制字段”中,即您使用的 DBMS。我更喜欢的第二个选项是将二进制数据(密文)转换为文本格式,然后将结果存储在普通字符串字段中,就像您存储用户名一样。您可以通过使用 Base64 编码来应用它,对密文进行编码,然后将其存储在 db 中。当你想要从 db 得到密文时,你将执行相反的操作,解码字符串。
  • 如何在 MS Access 中使用它?也就是说,您对托尼的询问的回复根本不包括任何特定于 Access 的内容,而问题是关于 Access 的。 -1
  • 这个问题根本不是访问特定的!这个问题有一个 Java 标签,所以大概 OP 正在编写 Java 代码来与数据库对话。这个解决方案很好,几乎可以与任何数据库一起使用。
【解决方案2】:

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

【讨论】:

  • -1 ByteToString() 和 StringToByte() 转换与 MS-ACCESS 无关。这些是转换器/编码器方法,任何人都可以在不使用 MS Crypto 接口的情况下编写类似的方法!不要在不了解代码的作用的情况下使用/复制/粘贴代码。
  • 知识库文章中有VB示例代码,重点是如果从string-to-byte和byte-to-string转换的话,用text没关系用于存储加密值的数据类型。关键是您必须跟踪需要转换的位置,这就是我引用我在 Access 中使用的方法的重点——不是因为它是 Access 特定的,而是作为如何避免问题的示例您存储加密值的数据类型。
  • 你的权利,我同意你的看法。这种转换作为(编码器/解码器)方法工作,最后它们从字节转换为字符串,从字符串转换为字节。请参阅我的答案中的示例。那么为什么你不喜欢我的答案并在它与你的答案相似时减少它,它们都从字节转换为字符串,从字符串转换为字节(而我的答案也比你的解决方案更好,因为它独立于 MS-Crypto API )。请在你点击减少/增加按钮之前三思而后行,因为这是不公平的。关于。
【解决方案3】:

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

【讨论】:

  • 谢谢,但是有没有兼容的数据类型来存储二进制数据?
  • 如果您在检索和存储数据时进行了适当的转换,则不必使用 BLOB 字段。
猜你喜欢
  • 1970-01-01
  • 2023-04-09
  • 2017-07-24
  • 2018-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-19
  • 1970-01-01
相关资源
最近更新 更多