-->

后端面试38讲_33_30_安全性架构为什么说用户密码泄漏是程序员的锅

你好,我是李智慧。

系统安全是一个老生常谈又容易被忽视的问题,往往只有在系统被攻击了,数据泄露了才会关注软件安全问题。

互联网应用呢因为要向全球用户提供服务,在任何地方都可以访问互联网应用。

任何恶意的用户都可以在世界任何地方对互联网系统发起攻击。

因此,互联网系统又具有天然的脆弱性,在互联网各种安全问题中,最能够引发话题刺激大众神经的就是用户密码泄露,数据库被脱库,导致所有的数据泄露。

这种系统安全问题涉及的因素可能有很多,大部分都和软件开发的工程师没有关系。

但是因为数据库被脱库,黑客直接获得了用户密码的敏感信息,导致用户密码泄露就是程序员的责任了。

通过对用户密码、身份证号、银行卡号等敏感安全问题,保护数据安全是软件安全架构的一个部分,是程序员和架构师的责任。

在软件开发过程中,主要有三种加密方法,单向闪列加密、对称加密和非对称加密。

用户密码加密通常用的是单向闪列加密,所谓的单向闪列加密是指对一段明文信息进行单向闪列加密,得到密文信息是不可以被解密的。

也就是说,给定一个密文,就算是加密者,也无法知道它的明文是什么。

加密是单向的,不支持解密单项闪列。

加密实际上是一种哈希算法。

我们熟悉的MD五算法呢就是一种单向闪列加密算法。

单项闪列算法虽然无法通过密文进行解密,密算还原得到原始密文。

但是呢如果知道了算法,就可以通过彩虹表的方法进行破解。

彩虹表是常用密文和密文的映射表,很多人喜欢用生日做密码,其实啊生日的组合是非常有限的,轻易就可以建立一个生日和密文的映射表。

如果黑客得到的密文,可以通过得表的方法得到密码密文,因此在实践中使用单向散列算法加密,还需要在算法过程中加一点盐sht.如果黑客不知道加的言是什么,就无法建立彩虹表还原得到你问单项省略加密的主要应用场景就是应用到用户密码加密上。

你在文章中可以看到加密和密码校验的过程。

用户在注册的时候需要输入密码,应用服务器得到密码以后调用单项闪列加密算法,对密码进行加密,然后将加密后的密文重储到数据库中。

用户下一次登录的时候,在客户端依然需要输入密码。

而用户输入的密码发送到为服务器以后,服务器对输入的密码再进行一次单向闪列,加密得到密文,然后和从数据库中取出来的密文进行对比。

如果两个密文是相同的,那么用户的登录校验就是成功的。

通过这种手段呢,可以保证用户密码的安全性,即使数据库被黑客脱库,也不会泄露用户密码,密码加密的时候也需要加一点盐。

这种场景下,每个用户加的言都可以不同,比如用用户的ID作为言,这样可以增加破解的难度。

另一种加密手段是对称密文,然称加密。

顾名思义就是使用一个加密算法和一个密钥,对一段明文进行加密后得到密文,然后使用相同的密钥和对应的解密算法,对密文进行解密,就可以计算得到密文。

对称加密主要用于加密一些敏感信息,对密文进行信息重储和传输。

但是在使用的时候呢,需要解密得到明文信息的一些场景。

比如用户的信用卡使号,很多互联网电商网站支持用户用信用卡进行支付。

但是如果直接把信用卡卡号有效期、安全码重储在数据库中是比较危险的,所以必须要对这些信息进行加密。

在数据库中重储密文。

但是在使用的时候呢,又必须对密文进行解密,还原,得到明文才能够正常使用。

所以这个时候呢就要使用对称加密算法,在重储的时候使用加密算法进行加密。

在使用的时候使用解密算法进行解密。

还有一种加密被称为非对称加密。

所谓的非对称加密,是指在加密的时候,使用一个加密算法和一个加密密钥进行加密。

得到一个密文。

解密的时候呢,必须要使用解密算法和解密密钥进行解密,才能够还原得到明文加密密钥和解密密钥完全不同。

通常加密密钥被称作是公钥,解密密钥被称作是私钥非对称加密的典型应用场景。

就是我们常见的HTTPS用户在客户端进行网络通信的时候,对数据使用加密密钥及公钥和加密算法进行加密,得到密文。

密文到了数据中心的服务器以后,使用解密密钥及私钥和解密算法进行解密,得到密文所于非对称加密需要消耗的计算资源比较多,效率也比较差。

用TPS并不是每次请求响应都使用非对称加密,而是先利用非对称加密,在客户端和服务器之间交换一个对称加密的密钥。

然后每次请求响应都用对称加密,这样用非对称加密,保证对称加密密钥的安全性,再用对称加密密钥,保证请求响应数据的安全性。

使用非对称加密还可以实现数字签名,用数字签名的时候是反过来的,用自己的私钥进行加密,得到一个密文。

而其他人呢可以用公钥将密文解开,然为私钥,只有自己才拥有。

所以等同于签名一段经过自己只有加密的文本文本内容,就等于使自己签名认证过的。

我在后面有讲到的区块链架构中交易就使用非对称加密进行签名。

互联网应用对外提供服务。

主要就是通过HTTP协议,任何人都可以在任何地方通过HTTP协议访问互联网应用。

因此,HTTP攻击是黑客攻击行为中门槛最低的攻击方式,也是最常用的一种互联网攻击。

而HTTP攻击译最常见的是circle注入和XSS攻击。

Circl注入就是攻击者在提交的请求参数里面包含恶意的circle脚本包。

在文稿中写了一个circle注入攻击的例子。

你可以看一下circle注入攻击。

我在第六篇讲到过最有效的防攻击手段就是circle预编译。

Java开发的话最好是使用prepare statement提交circle.而my bett的ORM框架主要的circle提交方式就使用prepare statement XSS攻击及跨站立脚本攻击。

攻击者构造恶意的浏览器脚本文件,使其在其他用户的浏览器上运行,从而进行攻击。

攻击者发送一个含有恶意脚本的请求给被攻击的服务器。

比如,通过发布微博的方式,向微博的服务器发送恶意请求被攻击的服务器将恶意脚本重组到本地的数据库中。

而其他的正常用户通过被攻击的服务器浏览信息的时候,服务器就会读取数据库中含有恶意脚本的数据,并将其展现给正常的用户。

在正常用户的浏览器上执行,从而达到攻击的目标。

Xss攻击防御的主要手段是消毒检查用户提交的请求中是否有可执行的脚本。

因为大部分的攻击请求都是包含JS等脚本语法,所以可以通过HTML转译的方式,对有比较危险的脚本语法关键字进行转译。

比如把左监括号转译为and GT HTML显示的时候还是正常的左键括号。

但是这样的脚本无法在浏览器上执行,也就无法达到攻击的目的。

由于HTTP攻击必须以HTP请求的方式提交到服务器,因此可以在服务器的入口统一进行拦截。

对含有危险请求的信息,比如drop、 table、 JS脚本等进行消毒转移,或者直接拒绝请求及设置一个web应用防火墙,将危险请求隔离开来。

针对web应用防火墙,我们可以自己开发一个统一的请求过滤器进行拦截,也可以使用motl secret.这样的开源的WF,硬件指令和操作系统可能会有漏洞,我们使用的各种框架和SDK可能也有漏洞。

这些漏洞从被发现到被公开到官方修复漏洞中间,可能会经历一个或长或短的时间,这个时间就可能被掌握了。

这些漏洞的黑客利用攻击系统。

这种漏洞在官方修复之前,我们基本上是没有办法应对的。

但是黑客攻击也不是无意义的攻击,而是为了各种利益而来。

很多时候是针对数据而来。

但是,数据加密重组和传输,即使是数据泄露了,黑客也无法对数据解密。

利用数据获利也可以保护我们的数据资产。

同时加强请求的合法性检查。

这些主要的HTTP攻击及时更新生产环境的各种软件版本,修复安全漏洞,提高黑客攻击的难度,使其偷入产出不成比例,从而营造一个相对安全的生产环境。

除了文中提到的HTTP攻击方式,还有哪些比较常见的HTTP攻击对应的防护手段有哪些?欢迎你在评论区写下你的思考,也欢迎把这篇文章分享给你的朋友,或者同事一起交流。