Agile PLM: Checksum文件校验在File Server中的应用
本文内容
本文介绍Agile PLM中File Manager文件服务器所使用的checksum校验原理及相关知识。在Agile中如果启用了Checksum功能,我们有时能在下载文件、checkout或者checkin的时候,碰到如下错误,即表示原始文件遭到了外部程序的篡改。
对于文件的checksum校验有非常多的方法,常见的有SHA1, MD5和CRC32。在Agile PLM中,文件的Checksum使用CRC32。对CRC算法感兴趣的可以查看此文:
http://en.wikipedia.org/wiki/Cyclic_redundancy_check
Agile中的Checksum
在Agile中每次上传文件后,新计算出的checksum值保存到file_info表的checksum_value栏位。在checkout(get)前,会重新计算文件服务器上的文件checksum并和数据库中的值做比较。
由于checksum的计算需要消耗一定的时间,对于大文件,可能出现秒级的延迟。在Agile PLM9.3.1.2中打开File Server的DEBUG开关做如下测试查看延时信息。
1. 当上传729,207,676字节(约720M)大小的文件时,日志显示checksum的计算耗时2.078秒。
<2012-12-09 19:51:23,545> <Vault:INFO> Entering updateChecksum => File ID:6020222 Vault Type :Standard Vault : Primary VaultRelativeFilePath :000/060/202/AGILE_16020222.zip<2012-12-09 19:51:23,559> <EventDispatcher:DEBUG> Inside postCheckIn =>ServerContext:com.agile.webfs.components.security.ServerContext@d306dd File ID :6020222Checksum value :0 EIFS filepath :null IFS filepath :000/060/202/AGILE_16020222.zip HFS filepath :null Locations :http://localhost:8080/Filemgr/services/FileServer File type :zip<2012-12-09 19:51:23,559> <Checksum:INFO> Checksum Enabled:true<2012-12-09 19:51:25,637> <Checksum:INFO> Computed checksum value: 3309565842<2012-12-09 19:51:25,637> <TimerUtil:DEBUG> Action:Checksum::postCheckIn Time Taken:2.078 secs<2012-12-09 19:51:25,637> <FMInformationStore:INFO> Adding file information fileID :6020222 EIFS filepath :null IFS filepath :000/060/202/AGILE_16020222.zip HFS filepath :null Locations :http://localhost:8080/Filemgr/services/FileServer File type :zipPersistence Level :1<2012-12-09 19:51:25,637> <TimerUtil:DEBUG> Action:EventDispatcher::postCheckIn Time Taken:2.078 secs<2012-12-09 19:51:25,637> <TimerUtil:DEBUG> Action:Vault:: updateChecksum Time Taken:2.092 secs<2012-12-09 19:51:25,637> <FileServerDispatcher:DEBUG> Leaving updateCheckSum
2. 下载相同大小的文件,checksum被重新计算,耗时为2.559秒。
<2012-12-09 20:18:49,719> <Checksum:INFO> Checksum Enabled:true<2012-12-09 20:18:52,278> <Checksum:INFO> Computed Checksum value: 3309565842<2012-12-09 20:18:52,278> <TimerUtil:DEBUG> Action:Checksum::preCheckOut Time Taken:2.559 secs
上述计算都在Tomcat服务器的JVM中完成,因此适当提高文件服务器的CPU也是可以考虑的范围。
企业开发应用
Checksum可以运用在我们自己的应用程序开发中。使用java.util.zip.CRC32非常方便高效。下述代码演示了使用CRC32类来快速计算一个1,444,792,736字节(约1.2G)大小的文件的checksum值,耗时14342毫秒。必须注意的是此处的checksum value是个十进制。
package zigzag.research.checksum;import java.io.*;import java.util.zip.CRC32;public class ChecksumCalc { public static void main(String args[]) { final int BUFFER_SIZE = 1024; byte[] buffer = new byte[BUFFER_SIZE]; CRC32 checksum = new CRC32(); InputStream is = null; int length; long begin = System.currentTimeMillis(); long end; try { is = new FileInputStream(new File("d:\\java_pid3256.hprof")); checksum.reset(); while ((length = is.read(buffer, 0, BUFFER_SIZE)) != -1) { checksum.update(buffer, 0, length); } end = System.currentTimeMillis(); System.out.println("checksum value=" + checksum.getValue() + ", time=" + (end-begin) + "ms"); } catch (Exception e) { e.printStackTrace(); } }}
运行结果:
D:\Program\Java\jdk1.5.0_07\bin\java zigzag.research.checksum.ChecksumCalcchecksum value=2151428387, time=14342ms网络下载应用
checksum的校验在国外的各类下载应用中十分普遍,目的就是为了防范文件被恶意篡改。比如下面的一个文件下载提供了SHA1的校验值供用户检查文件是否合法。
我们可以使用免费的checksum计算工具HashCalc,下载地址为: http://www.slavasoft.com/hashcalc/index.htm
以上述Java代码计算的checksum来做例子运行HashCalc,得到十六进制的803C3123,就是上述十进制的2151428387。