摘要:机动车登记系统统一版软件在全国推广应用后,信息核查的安全问题已成为关注的焦点。本文分析了机动车登记系统的信息核查安全需求,并根据公安专用网络的特殊性,通过把java语言数字签名和oralce系统软件包数据库数据的加密与解密有机的结合起来,解决机动车登记系统中的信息核查安全问题。
机动车登记系统统一版软件在全国推广应用后, 在提高效率、规范业务、打击犯罪、提供便民利民服务等方面取得了明显成效。实现了统一数据标准、统一发牌证流程、统一数据更新传输、统一制证式样、统一倒查监控方式。随着应用的深入,信息系统对业务的支撑越来越关键,系统可用性和安全性直接关系到业务的正常延续,同时通过系统与其他系统进行自动核查的项目不断增加,如与进口车核查系统核查进口凭证信息的真伪,与合格证核查系统核查国产机动车合格证信息的真伪,其信息传输安全面临越来越严峻的挑战:如何保证机动车基本信息、核查信息、核查结果等关键数据在信息核查过程中不被非法盗用、篡改和破坏,是机动车登记系统中信息核查的核心问题。
这就需要一种强有力的安全措施来保护核查机密数据不被窃取或篡改。数字签名和加密算法的有机结合为信息核查提供了很好的解决方法。本文分析了机动车登记系统的信息传输安全需求,并根据公安专用网络的特殊性,通过多种加密算法的综合应用来解决机动车登记系统中的数据安全传输问题,此方法可运用到公安交通管理信息的其它业务系统。
1、信息核查安全需求
机动车登记系统运行于公安专有网络,根据《全国机动车/驾驶人信息管理系统改造及资源库建设实施方案》的要求,机动车登记系统采用B/S模式,在地市或省级机关建服务平台,并统一使用Oracle 数据库和IBM WebSphere应用服务器,并且系统由各地系统管理员进行安装和维护,全国进口车核查系统、国产合格证核查系统等部署在公安部。
在信息核查的过程中,核查信息可能被截取、篡改、伪造或发生发送方抵赖等问题。为了核查信息的真实性,需要解决的最重要的三个问题:一是身份验证,当数据进行传输的时候,必须保证数据来自受信任的一方;二是机密性,确保数据的保密性;三是数据完整性,确保数据免受意外或者故意的修改。应用数字签名技术能保证数据的完整性和抗否定性,数据的机密性利用传输过程中将明文加密实现。但由
于公安交通管理信息系统均基于Java EE 的应用程序,并由全国各交警支队系统管理员自行维护和安全,软件易被反编译,数据加密存在安全隐患,因此本文利用oralce系统软件包数据库数据的加密与解密技术,将很大程度上增加其安全性。
2、数字签名
数字签名的基础是公钥密码体系。发送者有独一无二的公钥和私钥,公钥是公开的,私钥秘密保留。发送者利用私钥对数据的消息摘要进行数字签名,接收者利用发送者的公钥来验证数字签名,其实就是把加密过程颠倒过来使用。由于发送者的私钥是独一无二的,而且是秘密的,因此当能够验证解开数字签名的数字摘要是正确的后,那么我们就可以肯定发送者的身份了,这就是数字签名的基本原理。假设A要发送一个电子文件给B,A、B双方只需经过下面三个步骤即可:
1)A用其私钥加密文件,这便是签字过程。
2)A将加密的文件送到B。
3)用A的公钥解开A送来的文件。
这样的签名方法符合可靠性原则:
1)签字是可以被确认。
2)签字是无法被伪造。
3)签字是无法重复使用。
4)文件被签字以后是无法被篡改。
5)签字具有无可否认性。
目前主要有三种应用广泛的方法:RSA签名、DSA签名和Hash签名。本文选择RSA 加密算法来实现数字签名。RSA 算法出现于1978 年,由Ron Rivest,AdiShamir 和Leonard Adleman 发明的,是第一个既能用于数据加密也能用于数字签名的算法。RSA 算法密钥对的产生:选择两个大素数,p 和q,计算n =p*q;然后随即选择加密密钥,要求e 和(p-1)*(q-1)互质。最后,利用Euclid 算法计算解密密钥d,满足e*d = 1(mod(p-1)(q-1)),其中n 和d 也要互质。数e 和n 是公钥,d 和n 是私钥。两个素数p 和q 不再需要,应该丢弃,不要让任何人知道。RSA 加密过程:发送者所要发送的文件为m,计算c =E(m) = md mod n,c 是加密后的密文。RSA解密过程:文件接收者对接收到的c,利用m' = ce modn,m'是解密后的明文。
Java2中需要用到的主要的类基本上都封装在java.security.*和javax.crypto.*两个包中,主要实现过程如下:
(1)生成一对密钥,即私钥和公钥,对于密钥的保存可以使用对象流的方式进行保存和传送,也可以使用编码的方式保存;因涉服务器的操作系统和语言的问题,本文使用编码方式进行保存的;主要使用java.security.Signature.*类,其主要实现方法如下:
try {
java.security.KeyPairGenerator keygen = java.security.KeyPairGenerator.getInstance("RSA");
SecureRandom secrand = new SecureRandom();
secrand.setSeed("veh.tmri".getBytes()); // 初始化随机产生器
keygen.initialize(1024, secrand);
KeyPair keys = keygen.genKeyPair();
PublicKey pubkey = keys.getPublic();
PrivateKey prikey = keys.getPrivate();
pubKey = bytesToHexStr(pubkey.getEncoded());
priKey = bytesToHexStr(prikey.getEncoded());
……
} catch (java.lang.Exception e) {
e.printStackTrace();
}
(2)、编写发送者的功能:首先通过私钥加密待输出数据Data,并输出Data和签名后的Data。
try {
String privateKey = "30820275020100300d06092a864886f7";//这是GenerateKeyPair输出的私钥编码
PKCS8EncodedKeySpec priPKCS8Encode=new PKCS8EncodedKeySpec(hexStrToBytes(privateKey));
KeyFactory keyf=KeyFactory.getInstance("RSA");
PrivateKey myprikey=keyf.generatePrivate(priPKCS8Encode);
String VehInfo = getVehInfo(xh); // 要签名的信息,由数据库加密生成信息
// 用私钥对信息生成数字签名
java.security.Signature signet = java.security.Signature.getInstance("MD5withRSA");
signet.initSign(myprikey);
signet.update(myinfo.getBytes("ISO-8859-1"));
……
} catch (java.lang.Exception e) {
e.printStackTrace();
}
(3)、编写接收者的功能:使用发送者的公钥来验证发送过来的加密数据,判断签名的合法性。
try {
String pubkeyvalue = "30819f300d06092a864886f70d010101";//这是GenerateKeyPair输出的公钥编码
X509EncodedKeySpec bobPubKeySpec = new X509EncodedKeySpec(hexStrToBytes(pubkeyvalue));
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PublicKey pubKey = keyFactory.generatePublic(bobPubKeySpec);
String VehInfo = getVehInfo(xh);//
byte[] signed = hexStrToBytes("2292e02ba6bf6f1b1688a6fa2"); //输出的数字签名
java.security.Signature signetcheck =java.security.Signature.getInstance("MD5withRSA");
signetcheck.initVerify(pubKey);
signetcheck.update(VehInfo.getBytes());
if (signetcheck.verify(signed)) {
…… //签名正常,调用存储过程进行业务核查
}
Else{
……
//非签名正常,进行异常处理
}
……
} catch (java.lang.Exception e) {
e.printStackTrace();
}
3、数据机密性的实现
对于数据的机密性通过对数据的加密进行解决,使用加密算法将明文转换为密文,并使用相应的解密算法将密文转换回明文。DES算法把64位的明文输入块变为64位的密文输出块,它所使用的密钥也是64位,DES算法中只用到64位密钥中的其中56位。DES加密和解密使用相同的算法,唯一的不同是密匙的次序相反。如果各轮加密密匙分别是K1, K2, K3?. K16解密密匙就是K16, K15, K14?K1。Oracle 系统软件包Dbms_Obfuscation_Toolkit. Des3encrypt是用Triple DES算法加密数据,它基于DES,使用3个独立的56bit密钥对交换的信息进行3次加密,使其有效长度达到168bit,主要实现过程如下:
Function Decrypt_Vehinfo(Input_Value In Varchar2) Return Varchar2 As
Decrypted_Raw Raw(2000);
Decrypted_Value Varchar2(4000);
Begin
If Raw_Key Is Null Then
Get_Raw_Key;
End If;
Decrypted_Raw := Dbms_Obfuscation_Toolkit.Des3decrypt(
Input => Utl_Raw.Cast_To_Raw(Input_Value),Key => Raw_Key);
Decrypted_Value := Utl_Raw.Cast_To_Varchar2(Decrypted_Raw);
Return Decrypted_Value;
End;
Function Encrypt_Vehinfo(Input_Value In Varchar2)
Return Raw As
Encrypted_Raw Raw(2000);
Encrypted_Value Varchar2(4000);
Begin
If Raw_Key Is Null Then
Get_Raw_Key;
End If;
Encrypted_Raw := Dbms_Obfuscation_Toolkit.Des3encrypt(
Input =>Utl_Raw.Cast_To_Raw(Input_Value), Key =>Raw_Key);
Encrypted_Value := Utl_Raw.Cast_To_Varchar2(Encrypted_Raw);
Return Encrypted_Value;
End;
3 结束语
通过把java语言数字签名和oralce系统软件包数据库数据的加密与解密有机的结合起来,确保信息在核查的过程中不会被篡改和窃取,解决机动车登记系统中的信息核查安全问题,此方法可运用到公安交通管理信息系统的其他系统。
[参考文献]
[1] 杨 波. 现代密码学. 北京:清华大学出版社, 2003; 162-170
[2] Richard Mollin, Chapman. RSA and public-key cryptography[C].Proceeding of SCIS,2004:603-608.
[3] Oded Goldreich着,温巧燕,杨义先等译. 密码学基础(第二卷) [M ]. 北京:人民邮电出版社, 2005
[3]蔡子龙,俞集辉。Web服务在远程报表打印系统中的应用[J]。重庆大学学报,2004,27(10):93-96
[4]唐伟,ASP.NET环境下查询式Web动态报表的实现[J],计算机与现代化,2006,(9):124-126
[5]吴雷, 袁兆山,李超。B /S 结构下复杂报表实现技术的研究[J],计算机应用研究,2006,(5):83-85
作者简介:
1、是建荣,公安部交通管理科学研究所,助理研究员,从事交通管理信息系统研发。
2、黄金,公安部交通管理科学研究所,助理研究员,从事交通管理信息系统研发
2、周建宁,公安部交通管理科学研究所,助理研究员,从事交通管理信息系统研发