安全性战术:分为与抵抗攻击有关的战术、与检测攻击有关的战术以及与从攻击中恢复有关的战术。
抵抗攻击:
- 对用户进行身份验证:
进入系统需要注册登录
import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; public class DAO { public user login(Connection con,user user) throws Exception{ user resultUser=null; String sql="select * from t_user where userName=? and password=?"; PreparedStatement pstmt=con.prepareStatement(sql); pstmt.setString(1, user.getUserName()); pstmt.setString(2, user.getPassword()); ResultSet rs=pstmt.executeQuery(); if(rs.next()){ resultUser=new user(); resultUser.setUserName(rs.getString("userName")); resultUser.setPassword(rs.getString("password")); } return resultUser; } //注册功能 public boolean register(Connection con,user user) throws Exception{ boolean flag=false; PreparedStatement pstmt = null; String sql="INSERT INTO t_user(userName,password)VALUES(?,?)"; pstmt = con.prepareStatement(sql); pstmt.setString(1, user.getUserName()); pstmt.setString(2, user.getPassword()); if (pstmt.executeUpdate() > 0) { flag = true; } return flag; } }
- 对用户进行授权
登陆的时候把用户权限码存入session中,然后从session中取权限
public class MenuFunction implements TemplateMethodModel{ @Override public Object exec(List arg0) throws TemplateModelException { int level = Integer.valueOf(arg0.get(0).toString()); //模块等级 int modelId=Integer.valueOf(arg0.get(1).toString()); //模块id int count=0; //记录session是否有此模块的权限码 HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); HttpSession session=request.getSession(); Object o = session.getAttribute("info"); if(o==null) return false; Info info = (Info) o; String authCode=info.getUser().getAuthCode(); //权限码 if(authCode.contains(";")){ String[] masks=authCode.split(";"); String[] m=masks[level].split(","); for (int i = 0; i < m.length; i++) { if(modelId==Integer.parseInt(m[i])){ ++count; }else{ count+=0; } } } if(count==0){ return false; }else{ return true; } } }
- 维护数据机密性
在用户注册时将用户的密码加密后再保存至数据库,提高了安全性,使用MD5加密算法将用户密码加密。
package com.vincent.utils;
import java.security.MessageDigest;
/*
* 负责给字符串数据进行加密
*/
public class MD5Utils {
public static String str2MD5(String strs) {
/*
* 加密需要使用JDK中提供的类
*/
StringBuffer sb = new StringBuffer();
try {
MessageDigest digest = MessageDigest.getInstance("MD5");
byte[] bs = digest.digest(strs.getBytes());
/*
* 加密后的数据是-128 到 127 之间的数字,这个数字也不安全。
* 取出每个数组的某些二进制位进行某些运算,得到一个新的加密结果
*
* 0000 0011 0000 0100 0010 0000 0110 0001
* &0000 0000 0000 0000 0000 0000 1111 1111
* ---------------------------------------------
* 0000 0000 0000 0000 0000 0000 0110 0001
*
* 把取出的数据转成十六进制数
*/
for (byte b : bs) {
int x = b & 255;
String s = Integer.toHexString(x);
if (x < 16) {
sb.append("0");
}
sb.append(s);
}
} catch (Exception e) {
System.out.println("加密失败");
}
return sb.toString();
}
}
- 维护完整性
应该如期提供数据。数据中可能有冗余信息.如校验和或哈希值。它们可以与原始数据一起进行加密,也可以单独加密。
限制暴露的信息
攻击者通常会利用暴露的某个弱点来攻击主机上的所有数据和 服务。设计师可以设计服务在主机上的分配,以使只能在每个主机上获得受限的 服务。
- 限制访问
防火墙根据消息源或目的地端口来限制访问。来自未知源的消息可能 是某种形式的攻击。限制对已知源的访问并不总是可行的。例如,一个公共网站 上可能会有来自未知源的请求。这种情况中使用的一个配置就足所谓的解除管制 区(DMZ)。当必须对Internet服务而非专有网提供访问时使用DMZ。它位于 Internet和内部网前面的防火墙之间。DMZ包含预计会从任意源接收消息的设备, 这些信息源包括Web服务、e-mail和域名服务等。
检测攻击:
- “入侵检测”系统。
入侵检测器必须有某种检测攻击的传感器,进行传感器融合的管理器.存储事件供以后进行分析的数据库,用于离线报告和分析的工具以及一个控制台,以使分析员能够修改 入侵检测操作。
从攻击中恢复:
- 与恢复状态相关的战术和与识别攻击者相关的战术
与恢复状态相关的战术与可用性一致,如冗余,但主要是对密码、访问控制列表和用户资料数据进行冗余。
用于识别攻击者的战术是“维持审计追踪”审计追踪就是应用到系统中的数据的所有事物和识别信息的一个副本,可以使用它来识别攻击者的操作,支持认可和系统恢复。