随笔 - 232  文章 - 1  评论 - 0  阅读 - 5608

浅论软件质量属性安全性

摘要

研究目的是为了确认软件质量属性中的安全性在软件开发运作中的重要作用,了解软件质量属性的定义,了解软件安全性的重要意义,了解对于软件安全性战术的划分,研究软件安全性战术代码级别的实现及其实例。研究方法采用问卷调查,查找相关文献等,研究结果为在软件质量属性中,安全性极为重要,其拥有三种战术,可以按这三种战术来进行软件安全性的维护,很多软件都将安全性放在重要位置,以求能在能够在激烈的网络攻击中脱颖而出,能够保证用户数据财产安全。

关键词

软件质量;安全性;战术

1 软件质量属性

软件质量属性主要包括六个部分:功能性,可靠性,易用性,可移植性,可维护性,安全性。在此论文中,我们主要对安全性进行论述。

2 安全性的定义

安全性又称为可靠性,表达的是软件的成熟度、容错性等。安全性是软件非常重要的一个质量属性,是每一个软件都必须面对的问题,当一个软件足够安全时,才能吸引用户,保证用户的安全,保证用户软件安全,进而可以保证财产安全,不造成巨大损失。

3 安全性的重要性

安全是系统的一种属性,它反映了系统正常或异常运行的能力,没有造成人身伤害或死亡的危险,也没有对系统环境造成破坏。考虑软件安全性很重要,因为大多数故障严重的设备现在都包含基于软件的控制系统。
安全性和可靠性相关但又不同。可靠性与给定规范的一致性和服务交付有关。安全涉及确保系统不会造成损坏,无论它是否符合其规范。系统可靠性对于安全至关重要,但还不够。安全性在软件考察中可以顺位第一,现如今由于技术的不断精进,软件规模也越来越庞大,在庞大的规模中,如果没有安全性的保障,如果有一个部件不够安全,整个系统就处于危险之中,现在基本社会离不开软件,软件如果出现问题,那么造成的损失可以说是不可估量的,是非常危险的,因此安全性的重要性不言而喻。

4 安全性的战术

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

4.1 抵抗攻击

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

  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;
  }

  1. 对用户进行授权
    授权能够保证经过了身份验证的用户的安全性。这通常通过在系统中提供一些访问控制模式进行管理。可以对单个用户进行访问控制,也可以对某类用户进行访问控制。可以根据用户分组、用户角色或个人列表定义用户类。
    体现在代码层面:@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;
        }
    }
}
  1. 维护数据的机密性
    应该对数据进行保护,以防止未经授权的访朐。•般通过对 数据和通信链路进行某种形式的加密来实现机密性。加密能够对持续维护的数据 提供额外的保护(授权并不能提供此类保护)。兄•方面,通信链路•般不具有 授权控制。对于通过公共可访问的通信链路传送数据来说.加密是惟•的保护措 施。对基于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();
  1. 维护完整性
    应该如期提供数据。数据中可能有冗余信息.如校验和或哈希值.它们可以与原始数据一起进行加密,也可以单独加密。
  2. 限制暴露的信息
    攻击者通常会利用暴露的某个弱点来攻击主机上的所有数据和服务。设计师可以设计服务在主机上的分配,以使只能在每个主机上获得受限的服务。
  3. 限制访问
    防火墙根据消息源或目的地端口来限制访问。来自未知源的消息可能 是某种形式的攻击。限制对已知源的访问并不总是可行的。例如,一个公共网站 上可能会有来自未知源的请求。这种情况中使用的一个配置就足所谓的解除管制 区(DMZ)。当必须对Internet服务而非专有网提供访问时使用DMZ。它位于 Internet和内部网前面的防火墙之间。DMZ包含预计会从任意源接收消息的设备, 这些信息源包括Web服务、e-mail和域名服务等。

4.2 检测攻击

检测攻击检测通常通过“入侵检测”系统进行。此类系统的工作方式是比较网络通信模式与数据库系统。在误检测的情况下,将通信模式与已知攻击的历史模式进行比较。在 异常检测的情况下,将通信模式与其本身的历史基线进行比较。通常,必须对数据包进行 过滤,以进行比较。可以根据协议、TCP标记、有效负荷大小、源或目的地地址以及端口 ,进行过滤。
入侵检测器必须有某种检测攻击的传感器,进行传感器融合的管理器.存储事件供以后进行分析的数据库,用于离线报告和分析的工具以及一个控制台,以使分析员能够修改 入侵检测操作。
检测攻击的实例:Windows 2000中文输入法漏洞是指在Windows 2000的最初版本中,中要使用者安装了中文输入法,就可以轻松进入Windows 2000系统,获得管理员权限,可以执行作何操作,是非常严重的漏洞。后来,微软进行攻击检测,才修补了漏洞。

4.3 从攻击中恢复

恢复:检查点/回滚:检查点就是使状态一致的同步点,它或者是定期进行,或者是对具体事件做出响应。当在两检查点之间发生故障时,则以这个一致状态的检查点(有快照)和之后发生的事务日志来恢复系统(数据库中常使用)。在将系统或数据恢复到正确状态时所使用的战术与用于可用性的战术发生了重叠,因为它们都是从不致的状态恢复到一致状态。二者的差别就是要特别注意维护系统管理数据的冗余副本,如密码、访问控制列表、域名服务和用户资料数据。用于识别攻击者的战术是“维持审计追踪”。审计追踪就是应用到系统中的数据的所有事务和识别信息的一个副本。可以使用审计信息来追踪攻击者的操作,支持认可(它提供进行了某个特定请求的证据)并支持系统恢复。审计追踪本身通常就是攻击目标,因此应以一种可靠的方式对其进行维护。
从攻击中恢复的实例:2021年10月19日,金蝶财务系统遭黑客攻击,所有账户数据都被加密。在原始文件名的基础上加了 [ideapad@privatemail.com].makop的后缀。程师对中毒文件进行了底层分析。该病毒采用AES512加密。加密算法复杂,但是仍然后巨大的漏洞可以利用。根据以往处理过很多makop勒索病毒的经验,采取回转方法,从攻击中恢复了系统。

5 结语

当今世界,软件的安全性尤为重要,在进行软件开发时更应注意安全性,以保证软件正常运用。

参考文献

[1]吴祥林.安全性战术.https://www.cnblogs.com/1061321925wu/p/12403670.html
[2]错与对并不是绝对的.质量属性之安全性战术. https://www.cnblogs.com/baimafeima/p/12416869.html
[3]金蝶被makop勒索病毒攻击数据恢复成功案例.https://www.docin.com/p-1091202665.html

posted on   学习的CYT  阅读(261)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示