在access中保存使用对象(Object)

原创 2006年05月25日 13:43:00

最近在做一个使用RSA+MD5算法实现数字签名的一个软件。因为考虑到RSA密钥对的管理与分发,所以采用数据库管理RSA密钥对。由于在java中RSA密钥使用java.security.interfaces.RSAPrivateKey;与java.security.interfaces.RSAPublicKey;两个类,因此需要将这两个对象持久化。

考虑到方便用户使用,因而不采用类似JDataStroe,MySQL甚至MS SQL SERVER啦,所以采用Access。

Access只支持文本,数字与OLE对象。而JDBC没有提供相应的方法操作OLE对象,但可以往OLE对象中写入2进制流。

因此,主要思想采用将对象Serialize到BtyeArray流,在将BtyeArray流写入到2进制流。取出对象时,方法相同。

代码如下:

//连接Access,我的文件名为:db/MyRSAStore.mdb,密码123,表:MyRSAKeys(name[文本],description[文本],RSApublicKey[OLE对象],RSAprivateKey[OLE对象],create_data[文本])
String conURL="jdbc:odbc:driver={MicroSoft Access Driver (*.mdb)};DBQ=db//MyRSAStore.mdb";
String password="123";

Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection con=DriverManager.getConnection(conURL,password,password);//这里只user或password用密码不行

//RSA密钥对象
KeyPair keyPair = lyRSA.generateKeyPair(1024);
RSAPublicKey pubKey = (RSAPublicKey) keyPair.getPublic();
RSAPrivateKey priKey = (RSAPrivateKey) keyPair.getPrivate();


//得到各个流
ByteArrayOutputStream bout1 = new ByteArrayOutputStream();
ObjectOutputStream oout1 = new ObjectOutputStream(bout1);
oout1.writeObject(pubKey);
oout1.flush();
oout1.close();//将pubKey对象写入ByteArrayOutputStream
   
ByteArrayOutputStream bout2 = new ByteArrayOutputStream();
ObjectOutputStream oout2 = new ObjectOutputStream(bout2);
oout2.writeObject(priKey);
oout2.flush();
oout2.close();//将priKey对象写入ByteArrayOutputStream
   
//得到ByteArrayInputStream,主要因为PreparedStatement.setBinaryStream()方法要求InputStream作为参数,如果采用pst.setBytes()方法向OLE对象写入byte将得到JDBC的Access数据不匹配异常
  
ByteArrayInputStream pubin=new ByteArrayInputStream(bout1.toByteArray());
ByteArrayInputStream priin=new ByteArrayInputStream(bout2.toByteArray());

//写入数据:
pst=con.prepareStatement("insert into MyRSAKeys(name,description,RSApublicKey,RSAprivateKey,create_data) values (?,?,?,?,?)");
pst.setString(1,"test");
pst.setString(2,"no");
pst.setBinaryStream(3,pubin,pubin.available());//pubin.available()获得流长度
pst.setBinaryStream(4,priin,priin.available());
pst.setString(5,new java.sql.Date(new java.util.Date().getTime()).toString());
pst.executeUpdate();

//读出数据
pst=con.prepareStatement("select * from MyRSAKeys");
ResultSet rs=pst.executeQuery();
while(rs.next()){
System.out.println(rs.getInt(1));
System.out.println(rs.getString(2));
System.out.println(rs.getString(3));

//从数据库中读出Bytes然后包装成ObjectInputStream,读出对象。
RSAPublicKey r=(RSAPublicKey)(new ObjectInputStream(new ByteArrayInputStream(rs.getBytes(4))).readObject());
RSAPrivateKey p = (RSAPrivateKey)(new ObjectInputStream(new ByteArrayInputStream(rs.getBytes(5))).readObject());
System.out.println(r);
System.out.println(p);
System.out.println(rs.getString(6));
}

//使用RSA密钥对象,加密test.txt文件得到密文encrypt_result.txt,解密得到明文decrypt_result.txt
File file = new File("test.txt");
FileInputStream in = new FileInputStream(file);
ByteArrayOutputStream bout = new ByteArrayOutputStream();
byte[] tmpbuf = new byte[1024];
int count = 0;
while ((count = in.read(tmpbuf)) != -1) {
bout.write(tmpbuf, 0, count);
tmpbuf = new byte[1024];
}
in.close();
byte[] orgData = bout.toByteArray();
byte[] raw = lyRSA.encrypt(p, orgData);
file = new File("encrypt_result.txt");
OutputStream out = new FileOutputStream(file);
out.write(raw);
out.close();
byte[] data = lyRSA.decrypt(r, raw);
File = new File("decrypt_result.txt");
out = new FileOutputStream(file);
out.write(data);
out.flush();


//程序完,测试通过,平台jdk1.5,Access2003,winXp sp3


结语:
 一般的,通过保存对象,我们可以保存各种类型数据到Access。

以上工作,欢迎大家指正其中错误

盘子060525

Android进阶——Sharedpreferences保存对象和图片等复杂类型的数据

Sharedpreferences保存序列化的对象和图片等复杂类型的数据
  • CrazyMo_
  • CrazyMo_
  • 2017年01月16日 18:15
  • 1783

JS对象Object的常用方法汇总

//Object.assign函数 //将来自一个或多个源对象中的值复制到一个目标对象 var first = {name : 'kong'}; var last = {age : 18}; var ...
  • kongjunchao159
  • kongjunchao159
  • 2017年04月11日 15:06
  • 777

Android通过反射打造可以存储任何对象的万能SharedPreferences

我们通常使用SharedPreferences存储一些需要保存在本地,但又不至于存储在数据库里的一些数据,一般我们用它来存储一些用户名,密码等数据是非常方便的,那么如果我们想要存储的信息有10几条,我...
  • nugongahou110
  • nugongahou110
  • 2015年07月16日 16:08
  • 7767

Android中SharedPreferences和序列化结合保存对象数据

http://blog.csdn.net/ykttt1/article/details/8782875 前言:        最近在做用户注册的时候,遇到了需要填写很多表单数据,不可能在一页把...
  • zhhtao89
  • zhhtao89
  • 2015年06月15日 21:23
  • 4444

ACCESS MDB数据库“对象的必要权限。请让管理员或安装此对象的人为你设置适当的权限”解决办法

前几天在搞一个MDB数据库的时候提示对象的必要权限。请让管理员或安装此对象的人为你设置适当的权限,在网上搜索了很多办法都不OK,最后摸索加谷歌,百度终于解决问题了,猜想很大大黑阔在搞MDB数据库的时候...
  • dmz1981
  • dmz1981
  • 2013年08月08日 20:29
  • 3839

源码阅读笔记:java.lang.Object

java.lang.Object是Java中所有类的父类(super class),是唯一一个没有父类的Java类。所有对象都会自动继承Object,通过Object可以了解一个对象最基本的行为。由于...
  • zdxiq000
  • zdxiq000
  • 2017年02月21日 00:46
  • 368

IE浏览器兼容性BUG以及跨域访问

IE版本的水这水非常的深,甚至不同的windows系统出现的问题都不一样。什么时候能做到所有的用户都不用IE10以下的版本,那什么时候这水就浅了。 水的来源就是:并不是每个员工都可以下载软件安装的,...
  • u010435615
  • u010435615
  • 2017年08月04日 16:42
  • 689

Object类之equals方法

class Cat {     int color;     int height;     int weight;     public boolean equals(Object obj...
  • Prince140678
  • Prince140678
  • 2016年07月05日 21:56
  • 2327

Access数据库小结

1、查询Access中的表名称 select name from MSysObjects where type=1 and flags=0 MSysObjects 2、几个查询结果Union ...
  • jbjwpzyl3611421
  • jbjwpzyl3611421
  • 2014年06月06日 13:18
  • 3263

Kotlin 博客 companion object 伴生对象,getter,setter,内部,局部,匿名类,可变参数

先来看一个名为message的类 在这个类中有一段包含在companion object中的代码,需要说一下的是,Kotlin的class并不支持static变量,所以需要使用companion ...
  • jiankeufo
  • jiankeufo
  • 2017年06月06日 10:56
  • 4044
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:在access中保存使用对象(Object)
举报原因:
原因补充:

(最多只允许输入30个字)