很多成型的应用软件都有试用版和正式版之分,试用版一般都有功能上的限制,同时也有使用次数或使用期限的限制。要使试用版成为正式版,有些软件是要求你拿注册码注册,还有一些软件是通过授权文件来区分试用版和正式版,从试用版变成正式版,只是把授权文件换一下而已。一般来说,桌面软件会采用注册码的方式较多,而服务器端软件采用授权文件的较多,授权文件一般会将要限制的信息,比如并发数、最后日期等明文、密文一块保存。
本人在做项目过程中采用了一种变通的解决方式,让我的应用有了使用日期的限制:
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 SecurityFilter extends HttpServlet implements Filter {
/**
*
*/
private static final long serialVersionUID = 920198400163140364L;
private FilterConfig filterConfig;
private Logger logger = Logger.getLogger(getClass());
public void doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain filterChain) throws IOException, ServletException {
// TODO Auto-generated method stub
NewCarBrandConfig config = new NewCarBrandConfig();
String expiration = config.getExpiration();
String signature = config.getSignature();
String target = "";
try{
target = SecurityUtil.doMessageDigest(expiration);
}
catch(Exception e){
e.printStackTrace();
}
if(!signature.equals(target)){
logger.warn("不合法的授权文件!");
return;
}
else{
Date today = new Date();
Date targetDay;
try {
targetDay = ToolUtil.getDateFromString(expiration,"yyyy-MM-dd");
if(today.after(targetDay)){
logger.warn("授权文件已过期!");
return;
}
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
filterChain.doFilter(arg0, arg1);
}
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub
this.filterConfig = arg0;
}
}
配置文件
expiration=2012-10-09
signature=fd23826ef02908bf7404839a32ae44b4
说明:这只是一个变通的解决办法,因为当授权文件不合法或者授权文件过期时,并没有停止程序运行,只是通过让过滤器强制返回,使用户在访问系统时只得到一个空页面,程序还在后台运行,但用户不能使用。