前言:
在互联网各种安全问题中,最能引发话题,刺激大众神经的就是用户的泄密问题,数据库被拖库导致所有的数据泄露,这种系统安全问题涉及的因素可能有很多,大部分和开发软件的程序员没有关系,但是因为数据库被泄露,黑客直接获得了用户的密码等敏感问题,用户密码泄露就是程序员的问题了。
数据加解密:
通过对用户密码、身份证号码、银行卡号等敏感数据加密,保护好数据的安全,是软件安全性架构的一部分,也是程序员和架构师的责任。
软件开发过程中,主要的使用加密方法有三种,单向散列加密,对称加密和非对称加密。
单向散列加密:
用户加密通常使用单向散列加密,所谓的单向散列加密是指对一串明文信息进行散列加密,得到的密文信息是不可以被破解的,也就是说给定一个密文,即使是加密者也无法知道他的明文是什么,加密是单向的,不支持解密的操作。
单向散列加密事实上是一种Hash算法,熟悉MD5算法知道,MD5算法本身就是一种散列加密算法,单向散列算法虽然无法通过密文进行解密的处理,还原密码到明文字符串。但是如果知道了算法,就可以通过彩虹表的方法进行破解的处理,彩虹表是常用明文和密文的映射表,很多人喜欢用自己的生日做密码,其实生日的组合是非常有限的,轻易就可以建立一个生日和密文的映射表,如果黑客得到了密文,可以通过查表的方法进行得到密码的明文字符串。
因此在实践中,使用单向散列算法进行加密的处理,还需要在计算的过程中加点“salt”,如果黑客不知道加的“salt”是什么的话,就无法建立彩虹表,还原得到明文。
单向散列加密的主要场景就是应用到用户密码加密上,加密和密码校验过程如下:
用户在注册的时候需要输入密码,应用服务器得到密码以后,调用单向散列加密算法,对密码进行加密的处理,然后将加密文件存储到数据库中,用户下一次登录的时候,在客户端依然需要输入密码,而用户输入的密码发送到Web服务器以后,Web服务器对输入的密码再进行一次散列加密的处理,得到密文,然后和从数据库中取出来的密文进行对比处理,如果两个密文是相同的,那么用户的登录验证就是成功的,通过这种手段,可以保证用户密码的安全性,即使数据库被泄露了,也不会泄露密码。
密码进行加密的时候,需要加点“salt”,这组创景下,每个用户加密的“salt”都可以不用,比如说使用用户的ID作为“salt”,这样可以增加破解的难度。
对称加密:
顾名思义,使用一个加密算法和一个秘钥,对一段明文进行加密以后得到密文,然后使用相同的秘钥和对应的界面算法,对明文进行解密的处理,就可以得到明文。对称加密主要是用于加密的一些敏感信息,对明文进行信息传输和存储,但是在使用的时候,必要解密得到明文信息的一些场景。
比如说用户的信用卡卡号,很多互联网电商网站支持用户使用信用卡进行支付的处理,但是如果直接把信用卡号码、有效期、安全码存储在数据库中是比较危险的,所以必须对这些敏感信息进行加密的处理,然后才能保存到数据库中。但是在使用的时候又必须进行解密的处理,还原得到明文数据,才能进行正常的使用,所以这个时候就要使用对称加密算法,在存储的时候使用加密算法进行加密,在使用的时候使用解密算法进行解密的处理。
非对称加密:
所谓非对称加密就是在加密的时候使用一个加密算法和一个加密秘钥进行加密的处理,才能够得到一个密文。在这个时候,必须使用解密算法和解密秘钥进行解密才能还原到明文信息,加密秘钥和解密秘钥是完全不同的,通常加密秘钥被称为公钥,解密秘钥被称为私钥。
非对称加密的典型应用场景,就是我们常见的HTTPS,用户在客户端进行网络通讯的时候,对数据使用加密秘钥即公钥和加密算法进行加密,得到密文。到了数据中心的服务器以后,使用解密秘钥即私钥和解密算法进行解密的处理,得到明文。
由于非对称加密需要消耗的计算资源比较多,效率也比较差,HTTPS并不是每次请求响应都用非对称加密进行处理,而是先利用非对称加密进行处理,在客户端和服务器之间进行交换一个对称加密的秘钥,然后每次请求响应都用对称加密,这样,用非对称加密保证对称加密秘钥的安全,再用对称加密秘钥保证请求响应数据的安全。
使用非对称加密,还可以实现数字的签名处理,用数字签名的时候是反着来的,自己私钥进行加密,得到一个密文。但是其他人可以用公钥将密文解开,因为私钥只有自己才能拥有,所以等同于签名。一段经过自己私钥加密后的文本,文本内容就等于是自己签名认证过的了。举例,区块链其实就是使用的非对称签名。
HTTP攻击和防护:
互联网应用对外提供服务主要就是通过HTTP协议进行处理的,任何人都可以在任何地方通过HTTP协议访问互联网应用,因此HTTP攻击是黑客攻击行为中门槛最低的攻击方式了,也是最常见的一种互联网攻击,最常见的是SQL的注入攻击和XSS攻击。
SQL注入攻击:
Sql注入攻击就是攻击者在提交的请求参数里面,包含了又恶意的SQL脚本,如下:
如果在Web页面上面输入用户名称,那么就会进行提交HTTP,服务器在处理计算以后,向数据库提交SQL查询命令进行处理。但是恶意的攻击者会提交带有sql注入的字符串进行请求处理,比如,带有drop table这样类似删除数据库的操作
XSS攻击:
XSS攻击即跨站点脚本攻击,攻击者构造恶意的浏览器脚本,使其在其他用户的浏览器上运行,进而进行攻击。
攻击者发送一个含有恶意脚本的请求给被攻击者的服务器,比如通过发布微博的方式向微博的服务器发送恶意的请求,被攻击的服务器将恶意脚本存储到本地的数据库中,使其他的正常用户通过被攻击的服务器浏览信息的时候,服务器会读取数据库中含有恶意脚本的数据,并且向其展现给正常的用户,在正常用户的浏览器上执行,从而达到攻击的目的。
XSS攻击防御的主要手段是消毒的作用,检查用户提交的请求中是否含有可执行的脚本,因为大部分的攻击请求都包含JS等脚本语法,所以可以通过HTML转义的方式,对比较有危险的脚本语法关键字进行转义,比如说把“>”转义为“>”,HTML显示的时候还是比较正常的“>”,但是这样的脚本无法在浏览器上执行,也就无法达到攻击的目的。
由于HTTP攻击必须以HTTP请求的方式提交到服务器上面,因此可以在服务器的入口统一进行拦截,对含有危险信息的请求,比如说drop table等的信息,进行消毒转义的处理,或者直接拒绝请求处理。即设置一个Web应用防火墙,将危险进行请求隔离处理。
针对Web应用防火墙,可以进行统一的请求过滤器进行拦截处理。
小结:
硬件指令和操作系统可能会有漏洞,使用各种框架和SDK可能也有漏洞,这些漏洞从被发现,公开,官方进行修复漏洞处理,可能需要一个很长的时间,这个时间内系统可能会被黑客攻击。
这种漏洞在官方修复之前,基本没用办法进行处理的。即使数据泄露了,黑客也很难进行加密数据的处理,也能保护公司的资产数据。
加强请求的合法检查,避免主要的HTTP攻击,及时更新生产环境的各种软件版本,修复安全漏洞,提高黑客攻击的难度,使其投入产出不成比例,从而使系统可以正常安全的环境。