后端成长之路系列·网络安全
Web 安全是指开发人员为保护 Web 应用程序免受可能影响业务的威胁而采取的保护措施。
1. HTTPS的重要性
链接: 深入浅出 HTTPS (详解版)
HTTPS(全称是 Hyper Text Transfer Protocol Secure)是 HTTP 的安全版本,它在 HTTP 和 TCP/IP 之间加入了 SSL/TLS 加密层。HTTPS 的重要性体现在以下几个方面:
-
数据加密:HTTPS 对数据进行加密,保护传输过程中的数据不被窃听和篡改。这意味着即使数据被截获,攻击者也无法解读数据内容。
-
身份验证:HTTPS 通过 SSL/TLS 证书验证服务器的身份,防止用户被引导到伪装的恶意站点。
-
数据完整性:HTTPS 保证数据在传输过程中不会被修改,从而确保了数据的完整性。
-
SEO 优化:搜索引擎(如 Google)倾向于对使用 HTTPS 的网站进行排名上的提升,这意味着 HTTPS 对搜索引擎优化(SEO)是有益的。
-
用户信任:浏览器通常会为 HTTPS 网站显示一个锁形图标,这为用户提供了信任的标志,表明他们的连接是安全的。
-
遵守法规:许多法规和标准(如 GDPR、PCI DSS)要求使用 HTTPS 来保护用户数据的安全性。
-
防止中间人攻击:HTTPS 阻止中间人攻击,如劫持攻击、注入攻击等,这些攻击可能会窃取敏感信息或在用户和网站之间插入恶意广告。
由于以上这些原因,现在几乎所有的新网站和应用程序都会默认使用 HTTPS。对于网站管理员来说,获取和安装 SSL/TLS 证书是确保网站安全的重要步骤。有些服务(如 Let’s Encrypt)甚至提供了免费的证书,以降低为网站启用 HTTPS 的门槛。
2. 加密算法介绍
MD5(Message-Digest Algorithm 5)是一个哈希函数,由于其广泛的漏洞,目前建议不要使用。它仍然用作校验和来验证数据完整性。
2.1 什么是MD5
MD5(消息摘要算法)哈希算法是一种单向加密函数,它接受任意长度的消息作为输入,并返回用于验证原始消息的固定长度摘要值作为输出。
MD5 哈希函数最初设计用作用于验证数字签名的安全加密哈希算法。但是,MD5 已被弃用,除了用作非加密校验和来验证数据完整性和检测意外数据损坏之外。
2.2 MD5 是如何工作的
MD5 消息摘要哈希算法处理 512 位字符串中的数据,这些字符串分为 16 个字,每个字由 32 位组成。MD5 的输出是一个 128 位消息摘要值。
MD5从任何密码、短语或文本生成 32 个字符的十六进制字符串的算法。例如,如果你的密码是“qwerty”(坏主意),那么在数据库中你将有 d8578edf8458ce06fbc5bb76a58c5ca4。
MD5 摘要值的计算在单独的阶段执行,这些阶段处理每个 512 位数据块以及前一阶段中计算的值。第一阶段从使用连续的十六进制数值初始化的消息摘要值开始。每个阶段包括四个消息摘要传递,用于操作当前数据块中的值和从前一个块处理的值。从最后一个块计算的最终值将成为该块的 MD5 摘要。
2.3 MD5 安全吗
任何消息摘要函数的目标都是生成看似随机的摘要。若要被视为加密安全,哈希函数应满足两个要求:
- 攻击者不可能生成与特定哈希值匹配的消息。
- 攻击者不可能创建生成相同哈希值的两条消息。
根据 IETF 的说法,MD5 哈希不再被视为加密安全的方法,不应用于加密身份验证。
2011 年,IETF 发布了 RFC 6151,“MD5 消息摘要和 HMAC-MD5 算法的更新安全注意事项”,其中引用了最近针对 MD5 哈希的一些攻击。它提到了一个在标准笔记本上在一分钟或更短的时间内产生哈希冲突,另一个可以在 10 GHz 的 Pentium 4 系统上在短短 2.6 秒内产生冲突。因此,IETF建议新的协议设计根本不应该使用MD5,并且最近针对该算法的研究攻击“提供了足够的理由来消除MD5在需要防冲突性的应用中的使用,例如数字签名。
2.4 MD5 为什么不安全
对 MD5 哈希的暴力攻击速度很快
暴力攻击是一种通过尝试多种可能性来查找密码的方法。
要么通过猜测用户可能使用的内容(出生日期、孩子的名字、宠物名字等),要么尝试所有内容(从 a、b、c 到 10 个字符的带有特殊字符的密码)。MD5 算法使用速度很快。因此,在几秒钟内,您可以尝试多种组合。
20年前,可能需要数年时间才能找到世界上最强大的计算机的密码今天,每个人的家里都有一台超级计算机
,随着处理器和图形处理器的改进,我们最多可以在几天内解密“安全”密码。最好的计算机每秒可以尝试数十亿个密码(来源:ZDNet)。
对暴力攻击的唯一抵抗力可能是密码长度。
如果您有一个 40 个字符长的随机密码,带有特殊字符,那么您目前可能是安全的,但还要多久?
MD5 字典表很大
通过在我们的数据库中存储超过 11,500 亿个密码,我们可以在几秒钟内为您提供任何哈希值的答案。
这是 MD5 算法的第二个问题。
它被广泛使用,以至于多年来已经创建了像这样的大型数据库。
如果你的密码在里面(如果你有一个“短”密码,很有可能),你的账户根本不安全。
至于暴力破解方法,唯一安全的方法是使用带有特殊字符的长随机密码。在这种数据库中拥有它的可能性太多了。
像这样的数据库占用了大量的磁盘空间。即使这些年来越来越便宜,它仍然是一个障碍。
MD5 发生冲突
MD5 算法也证明了其加密方法存在问题。
冲突是指两个单词生成相同的哈希值。
安全算法具有良好的抗碰撞性。
也就是说,对于不同的单词,您获得相同哈希值的机会很低。
但 MD5 的防撞性较低。
因此,如果您知道“abc”和“def”具有相同的生成哈希值(只是一个示例)。
你可以说“123abc”和“123def”也生成了相同的哈希值。
对于加密哈希函数来说,这是一个不好的属性,因为你可以猜到很多派生词。
2.5 解决办法
使用盐
基本上,盐是您将在每个密码之前和/或之后添加的单词。
如果您的 salt 是“randomsaltformypassword”,并且用户选择“qwerty”作为密码,您将使用“randomsaltformypasswordqwerty”作为 MD5 函数参数。
这样,您将在数据库中加密更长的密码,黑客将更难找到相应的密码。确保选择长盐以提高足够的安全性。
长密码
另一种解决方案是强制用户使用更长的密码(可能为 15 个字符或更多)。
您还可以添加密码复杂性,以确保它们使用大写、小写和特殊字符。
其他哈希函数
最好的解决方案可能是使用另一种加密算法。
这不是最简单的方法,因为您可能需要更改数据库结构,但它可能是最安全的。
2.6. SHA 家族
SHA(Secure Hash Algorithm,安全散列算法)家族是一系列密码散列函数的集合,由美国国家安全局(NSA)设计,并由美国国家标准与技术研究院(NIST)发布为联邦信息处理标准(FIPS)。SHA 算法主要用于确保数据的完整性,是许多安全协议和应用中的一个重要组成部分,包括 TLS/SSL、PGP、SSH 等。
SHA 家族包含以下几个主要成员:
-
SHA-0:在1993年发布,很快被发现有弱点,不推荐使用。
-
SHA-1:在 SHA-0 的基础上进行了改进,生成 160 位的散列值,但 SHA-1 也在2005年后被发现存在安全性问题,现在不再被认为是安全的。
-
SHA-2:包括多个版本,如 SHA-224、SHA-256、SHA-384 和 SHA-512,数字代表散列值的位数。SHA-2 相对于 SHA-1 来说更加安全,目前广泛使用。
-
SHA-3:原名 Keccak,是一种不同于 SHA-2 的算法,提供了与 SHA-2 相同长度的散列值。SHA-3 在2015年被 NIST 标准化,为系统提供了另一种散列算法选项。
SHA 家族的算法是不可逆的,意味着无法从散列值逆推出原始数据。同时,它们也被设计为抗碰撞的,即在计算上不可能找到两个不同的输入值,它们具有相同的散列值。
SHA 算法的一个典型应用是在存储密码时,系统会存储密码的散列值而不是原始密码。当用户输入密码时,系统会对输入的密码进行散列,然后将该散列值与存储的散列值进行比较。
2.7. Bcrypt
Bcrypt 是一种用于密码哈希的安全算法,它基于 Blowfish 对称块密码算法设计而成。Bcrypt 特别适合用于保护用户密码的存储,因为它包含了盐(salt)来保护 against 针对哈希函数的彩虹表攻击,并且可以通过增加工作因子(work factor)来适应处理器性能的提高,从而抵御暴力破解攻击。
Bcrypt 的关键特点包括:
- 盐的使用:自动集成盐来保护密码免受彩虹表攻击。
- 适应性:可以通过增加工作因子来增加哈希计算的复杂度。
- 慢速哈希:Bcrypt 故意设计为计算量大,以减缓密码破解速度。
- 广泛支持:多种编程语言都支持 Bcrypt 算法。
在密码存储的上下文中,Bcrypt 的工作流程通常如下:
- 当用户创建或修改密码时,系统会生成一个新的盐值并计算密码的 Bcrypt 哈希值。
- 系统将盐值和哈希值一起存储在数据库中。
- 当用户尝试登录时,系统会取出与该用户关联的盐值,并使用它再次对用户提供的密码进行哈希。
- 系统将这个新计算的哈希值与数据库中存储的哈希值进行比较,如果它们匹配,用户就被验证为合法用户。
3. OWASP
链接: OWASP Top Ten 2021 : Related Cheat Sheets
“OWASP Top 10” 是指由开放式网络应用安全项目(Open Web Application Security Project,简称 OWASP)发布的十大网络应用安全风险列表。这个列表大约每三年更新一次,目的是提醒开发人员和安全专家们最常见的网络安全问题。以下是最新版本的 OWASP Top 10 列表:
-
注入攻击(Injection):比如 SQL 注入,这种攻击发生在攻击者将恶意数据作为命令或查询的一部分发送到解释器中。
-
破坏身份认证(Broken Authentication):攻击者可能会利用这些缺陷来冒充其他用户。
-
敏感数据泄露(Sensitive Data Exposure):敏感信息比如财务数据、健康记录等未加密存储或传输。
-
XML 外部实体(XXE):对包含外部实体引用的 XML 输入进行攻击,可以用来进行各种攻击,包括读取内部文件、远程代码执行等。
-
失效的访问控制(Broken Access Control):未正确限制用户对功能和数据的访问。
-
安全配置错误(Security Misconfiguration):系统配置不当,可能导致未加密的数据传输,开放的云存储,未更新的服务器等。
-
跨站脚本(XSS):攻击者向网页插入恶意脚本,当其他用户浏览该页时,脚本会执行,可能导致用户数据被盗。
-
不安全的反序列化(Insecure Deserialization):攻击者可以通过创建恶意对象来攻击应用程序,这些对象在反序列化时会导致远程代码执行。
-
使用具有已知漏洞的组件(Using Components with Known Vulnerabilities):应用程序使用了已知有安全漏洞的库、框架或其他软件模块。
-
不充分的日志和监控(Insufficient Logging & Monitoring):缺乏足够的日志记录和监控,使得攻击的检测和应对变得更加困难。
了解和防范这些安全风险对于保护网络应用的安全至关重要。
4. Cors
4.1什么是CORS?
假设您正在 上运行一个网站,当您的 JavaScript 代码加载时,它会向 上运行的服务器发出请求。您可能会惊讶地发现您的请求已失败。这是因为浏览器遵循同源策略,并限制由一个源加载的文档或脚本如何与来自另一个源的资源进行交互:localhost:8000localhost:9000
浏览器允许对同一源中的服务器发出请求。
默认情况下,浏览器会阻止对不同源的请求(称为跨源请求),并发生 CORS 错误。
那么,什么是CORS?CORS 代表跨域请求共享,它是一种基于 HTTP 标头的机制,服务器可以告诉浏览器是否允许其他源与其资源交互。
4.1CORS工作原理
CORS 机制支持浏览器和服务器之间的安全跨域请求和数据传输。现代浏览器在 XMLHttpRequest 或 Fetch 等 API 中使用 CORS,以降低跨域 HTTP 请求的风险。
CORS(Cross-Origin Resource Sharing,跨域资源共享)是一种安全特性,它允许网页从与其不同的域(协议+域名+端口)请求资源。默认情况下,出于安全考虑,浏览器会限制跨域请求,但CORS提供了一种安全的方式来绕过这些限制。
CORS工作原理是通过HTTP头部来告诉浏览器允许一个网页访问另一个网页的资源。例如,如果您的网页通过AJAX请求从另一个域(比如 example.com)获取资源,那么 example.com 必须通过返回适当的CORS HTTP头部来明示允许这种跨域请求:
Access-Control-Allow-Origin: https://yourwebsite.com
或者使用通配符 * 允许所有域的跨域请求:
Access-Control-Allow-Origin: *
但是,通配符的使用在处理带有证书的请求(如Cookies或HTTP认证)时是有限制的。
除了 Access-Control-Allow-Origin,还有一些其他的CORS相关的HTTP头部,例如:
Access-Control-Allow-Credentials:表示是否允许发送Cookie。
Access-Control-Expose-Headers:允许白名单上的HTTP头部可被JavaScript(如从XMLHttpRequest或Fetch API)读取。
Access-Control-Max-Age:指定了preflight请求的结果能够被缓存多久。
Access-Control-Allow-Methods:指定了实际请求中允许使用的HTTP方法。
Access-Control-Allow-Headers:在实际请求中,允许自定义的HTTP头部字段。
正确配置CORS可以确保资源的安全共享,并防止不受信任的网站访问敏感数据。
5. SSL/TLS
链接: TLS详解
安全套接字层 (Secure Sockets Layer, SSL) 和传输层安全性 (Transport Layer Security, TLS) 是用于在 Internet 通信中提供安全性的加密协议。这些协议对通过 Web 传输的数据进行加密,因此任何试图拦截数据包的人都无法解释数据。重要的是要知道一个区别,即由于安全漏洞,SSL 现在已被弃用,大多数现代 Web 浏览器不再支持它。但 TLS 仍然安全且受到广泛支持,因此最好使用 TLS。
这些协议主要用于以下场景:
- HTTPS:在HTTP上实现加密,保护网页数据传输的安全。
- 电子邮件:在SMTP、POP3和IMAP协议上加密电子邮件数据。
- FTP:在文件传输协议上实现加密,创建FTPS。
- VPN:在虚拟私人网络连接中提供加密。
SSL/TLS协议工作流程概述:
-
握手:客户端和服务器之间的通信开始时,它们会通过SSL/TLS握手来建立安全连接。这个过程包括协商加密算法、交换密钥等。
-
证书验证:服务器会向客户端提供一个SSL/TLS证书,以证明服务器的身份。客户端会验证证书的有效性,确保证书由可信任的证书颁发机构签发,并且与服务器域名匹配。
-
密钥交换:客户端和服务器协商产生一次性会话密钥,用于加密后续的通信。
-
加密通信:握手完成后,客户端和服务器将使用协商的密钥对数据进行加密和解密,确保数据传输的私密性和完整性。
SSL/TLS的主要安全特性包括:
- 数据加密:防止数据在传输过程中被窃听。
- 身份验证:确保参与通信的双方是合法的。
- 数据完整性:保护数据在传输过程中不被篡改。
为了确保通信的安全,建议始终使用最新版本的TLS协议,并且定期更新和配置服务器上的加密套件和证书。
6. CSP
Content Security Policy(内容安全策略,简称CSP)是一个额外的安全层,用于帮助防止跨站脚本(XSS)、数据注入攻击等一系列的攻击。CSP通过指定合法的资源来源,可以限制网页能够加载和执行的资源类型,例如脚本、样式表、图片、媒体文件等。
CSP主要通过服务器返回的HTTP响应头部来实施。下面是一个CSP头部示例:
Content-Security-Policy: default-src 'self'; img-src https://*; child-src 'none';
这个策略的含义是:
default-src ‘self’:默认情况下,所有资源只能从同源加载(不包括子域)。
img-src https://*:图片可以从任何HTTPS源加载。
child-src ‘none’:不允许加载任何来源的frame内容。
CSP提供了大量的指令来定义安全策略,一些常见的指令包括:
default-src:定义加载所有资源的默认策略。
script-src:定义哪些源的脚本可以被执行。
style-src:定义哪些源的样式表可以被加载。
img-src:定义哪些源的图片可以被加载。
connect-src:定义哪些源可以通过脚本接口(如AJAX和WebSocket)进行连接。
font-src:定义哪些源的字体可以被加载。
object-src:定义哪些源的插件(如Flash)可以被加载。
media-src:定义哪些源的媒体文件可以被加载。
frame-src:定义哪些源的frame或iframe可以被加载。
report-uri:指定违反CSP策略的报告发送到哪个URL。
使用CSP可以显著提高网站的安全性,但也需要谨慎设置策略以避免过度限制导致网站功能不正常。建议逐步实施CSP策略,并充分测试以确保网站的兼容性和功能性。