很多成型的应用软件都有试用版和正式版之分,试用版一般都有功能上的限制,同时也有使用次数或使用期限的限制。要使试用版成为正式版,有些软件是要求你拿注册码注册,还有一些软件是通过授权文件来区分试用版和正式版,从试用版变成正式版,只是把授权文件换一下而已。一般来说,桌面软件会采用注册码的方式较多,而服务器端软件采用授权文件的较多,授权文件一般会将要限制的信息,比如并发数、最后日期等明文、密文一块保存。
本人在做项目过程中采用了一种变通的解决方式,让我的应用有了使用日期的限制:
1、将要限制的日期采用MD5加密,连同明文的日期一起放在一个配置文件里
2、在程序中加一个过滤器,读取这个配置文件,通过对读取到的明文重新进行加密,和从配置文件里读取到的密文进行比较
3、如果两者不一致,表明授权文件遭到篡改,不再继续提供服务
4、如果两者一致,继续比较从配置文件里读取的限制日期和当前日期,如果当前日期晚于限制日期,表明使用期限已到,不再继续提供服务
5、否则继续提供服务
相关代码如下:
加密类
- public class SecurityUtil { //采用这个类将明文加密
- /**
- * @param args
- */
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- String expiration = "2012-10-09";
- String signature = "";
- try{
- signature = SecurityUtil.doMessageDigest(expiration);
- }
- catch(Exception e){
- e.printStackTrace();
- }
- System.out.println("expiration:" + expiration + "\nsignature:" + signature);//产生的密文和明文一起存入配置文件
- }
- public static String doMessageDigest(String arg) throws Exception{
- //要生成摘要的明文
- byte[] b=arg.getBytes("UTF8");
- //生成摘要
- MessageDigest md=MessageDigest.getInstance("MD5");
- md.update(b);
- byte[]s=md.digest();
- //显示生成的摘要
- String res="";
- for(int i=0;i<s.length;i++){ //将字节数组转换成字符串
- res=res+Integer.toHexString((0x000000ff&s[i])|0xffffff00).substring(6);
- }
- return res;
- }
- }
public class SecurityUtil {//采用这个类将明文加密 /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub String expiration = "2012-10-09"; String signature = ""; try{ signature = SecurityUtil.doMessageDigest(expiration); } catch(Exception e){ e.printStackTrace(); } System.out.println("expiration:" + expiration + "\nsignature:" + signature);//产生的密文和明文一起存入配置文件 } public static String doMessageDigest(String arg) throws Exception{ //要生成摘要的明文 byte[] b=arg.getBytes("UTF8"); //生成摘要 MessageDigest md=MessageDigest.getInstance("MD5"); md.update(b); byte[]s=md.digest(); //显示生成的摘要 String res=""; for(int i=0;i