zoukankan      html  css  js  c++  java
  • 安全性战术

    安全性战术包括抵抗攻击的战术、检测攻击的战术和从攻击从恢复的战术。我们可以对此做一个很熟悉的比拟,给们装锁就是在抵抗攻击,在房子中放一个运动传感器就是在检测攻击,给房子上保险就是从攻击中恢复过来。

    一、抵抗攻击

    我们应把认可、机密性、完整性和保证确定为目标,可以组合使用下面的战术来实现这些目标。

    1、对用户进行身份验证。身份验证能够保证进行访问的用户或远程计箅机确实是它所声称的用户或计算机。密码、一次性密码、数字证书以及生物识别均提供身份验证。

    在代码层面添加用户注册登录,实行对用户的身份验证。

     public User login(User loginUser) {
        //编写SQL
        String sql = "select * from user where username = ? and password = ?";
        //调用query方法
        try {
          User user = template.queryForObject(sql,
              new BeanPropertyRowMapper<User>(User.class),
              loginUser.getUsername(), loginUser.getPassword());
          return user;
        } catch (DataAccessException e) {
          e.printStackTrace();
          return null;
        }
      }
    public boolean add(User user){
        //编写SQL
        String sql = "insert into user (username,password) VALUES('" + user.getUsername() + "','" + user.getPassword() + "')";
        boolean flag = false;
        int num = 0;
        try {
          //创建数据库连接
          Connection conn = JDBCUtils.getConnection();
          Statement state = null;
          flag = false;
          num = 0;
     
          state = conn.createStatement();
          num = state.executeUpdate(sql);
        } catch (SQLException e) {
          e.printStackTrace();
        }
     
        if(num >0) flag = true;
        return flag;
      }

    2、 对用户进行授权。授权能够保证经过了身份验证的用广冇权i方M和修改数据或服 务。这通常通过在:系统中提供一些访问控制模式进行管理。可以对单个用户进行 访问控制,也可以对某类用户进行访问控制。可以根据用户分组、用户角色或 个人列表定义用户类。

    体现在代码层面

    @Component
    public class MyRealM extends AuthorizingRealm {
    
    
        @Autowired
        private LoginService loginService;
    
        /**
         * 获取用户角色和权限,用于权限认证
         * @param principals
         * @return
         */
        @Override
        protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
    
            String username = principals.getPrimaryPrincipal().toString();
    
            SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
            //获取角色(从数据库中取出时使用逗号分隔的)
            UserInfo user = loginService.getUserByName(username);
            String[] roleArray = user.getUserrole().split(",");
    
            Set<String> roles = new HashSet<String>();
            for (String roleid : roleArray) {
                roles.add(loginService.getRoles(roleid));
            }
    
            //获取权限(根据角色查询权限表)
            Set<String> permissions = new HashSet<String>();
            for (String roleid : roleArray) {
                permissions.addAll(loginService.getPermissions(roleid));
            }
    
            info.setRoles(roles);
            info.setStringPermissions(permissions);
            return info;
        }
    
        /**
         * 设置用户登录认证
         * @param token
         * @return
         * @throws AuthenticationException
         */
        @Override
        protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
            //获取输入的用户账号,并通过账号获取相关信息
            String username = token.getPrincipal().toString();
            UserInfo user = loginService.getUserByName(username);
            if (user != null) {
                //将查询到的用户账号和密码存放到 authenticationInfo用于后面的权限判断。第三个参数传入用户输入的用户名。
                SimpleAuthenticationInfo authenticationInfo = new SimpleAuthenticationInfo(user.getUsername(), user.getPwd(), getName());
                //设置盐,用来核对密码
                authenticationInfo.setCredentialsSalt(ByteSource.Util.bytes(user.getRandom()));
              
                return authenticationInfo;
            } else {
                return null;
            }
    
        }
    
    
    }

    3、维护数据的机密性。应该对数据进行保护,以防止未经授权的访朐。•般通过对 数据和通信链路进行某种形式的加密来实现机密性。加密能够对持续维护的数据 提供额外的保护(授权并不能提供此类保护)。兄•方面,通信链路•般不具有 授权控制。对于通过公共可访问的通信链路传送数据来说.加密是惟•的保护措 施。对基于Web的链路.可以通过虚拟专用网(Virtual Private Network, VPN) 或安全奁接层(Secure Socket Layer, SSL)来实现该链路。加密可以是对称的(双 方都使用相同的密钥)或不对称的(公钥和私钥)。

    代码层面,利用shiro安全框架实现加密

    //生成盐(部分,需要存入数据库中)
            String random=new SecureRandomNumberGenerator().nextBytes().toHex();
             
             //将原始密码加盐(上面生成的盐),并且用md5算法加密三次,将最后结果存入数据库中
            String result = new Md5Hash("password",random,3).toString();

    4、维护完整性。应该如期提供数据。数据中可能有冗余信息.如校验和或哈希值.它们可以与原始数据一起进行加密,也可以单独加密。

     
    5、限制暴露的信息。攻击者通常会利用暴露的某个弱点来攻击主机上的所有数据和 服务。设计师可以设计服务在主机上的分配,以使只能在每个主机上获得受限的 服务。
     
    6、限制访问。防火墙根据消息源或目的地端口来限制访问。来自未知源的消息可能 是某种形式的攻击。限制对已知源的访问并不总是可行的。例如,一个公共网站 上可能会有来自未知源的请求。这种情况中使用的一个配置就足所谓的解除管制 区(DMZ)。当必须对Internet服务而非专有网提供访问时使用DMZ。它位于 Internet和内部网前面的防火墙之间。DMZ包含预计会从任意源接收消息的设备, 这些信息源包括Web服务、e-mail和域名服务等。

    二、检测攻击:

    一般通过“入侵检测”系统进行过滤、比较通信模式与历史基线等方法

    检测攻击检测通常通过“入侵检测”系统进行。此类系统的工作方式是比较网络通信模式与数据库系统。在误检测的情况下,将通信模式与已知攻击的历史模式进行比较。在 异常检测的情况下,将通信模式与其本身的历史基线进行比较。通常,必须对数据包进行 过滤,以进行比较。可以根据协议、TCP标记、有效负荷大小、源或目的地地址以及端口 ,进行过滤。
     
    入侵检测器必须有某种检测攻击的传感器,进行传感器融合的管理器.存储事件供以后进行分析的数据库,用于离线报告和分析的工具以及一个控制台,以使分析员能够修改 入侵检测操作。

    三、从攻击中恢复:

    恢复:检查点/回滚:检查点就是使状态一致的同步点,它或者是定期进行,或者是对具体事件做出响应。当在两检查点之间发生故障时,则以这个一致状态的检查点(有快照)和之后发生的事务日志来恢复系统(数据库中常使用)。

    识别攻击者:作为审计追踪,用于预防性或惩罚性目的。

  • 相关阅读:
    Qt ------ QPainter 和控件组件的重绘
    Qt error ------ no matching function for call to QObject::connect(QSpinBox*&, <unresolved overloaded function type>, QSlider*&, void (QAbstractSlider::*)(int))
    DHCP 服务器功能
    matlab --- plot画图
    网站跨域解决方案有哪些
    分布式Session一致性解决方案有哪些?
    博客收集
    idea快捷键
    Linux打包、压缩与解压详解
    lastIndex()与IndexOf()的区别
  • 原文地址:https://www.cnblogs.com/1061321925wu/p/12403670.html
Copyright © 2011-2022 走看看