互联网服务器的实现过程需要考虑哪些安全问题 & 加解密及哈希知识点

http://www.cnblogs.com/charlesblc/p/6341265.html 其中的一篇。

参考

https://zhuanlan.zhihu.com/p/20336461?refer=auxten

网络编程(四):互联网中TCP Socket服务器的实现过程需要考虑哪些安全问题?

在Internet环境下,安全问题我主要分为如下几类:

  1. 信息传输过程中被黑客窃取
  2. 服务器自身的安全
  3. 服务端数据的安全

首先,如果能用https,就尽量用https,能用nginx等常见服务器,就用常见服务器,主要能避免以下问题:

  • 自己实现的协议&Server端可能会有各种Bug,被缓冲区溢出攻击等
  • SSL加密体系在防监听方面已经足够成熟,值得信赖

如果需要自己实现Server端,实现一套合格的SSL还是很考验功底的:

  • 首先要弄明白SSL加密体系密钥交换的原理
  • 对各种对称、非对称加密算法要有深刻的理解
  • 用非对称加密算法怎么实现一套密钥交换体系
  • 如何处理ca证书,在自签名情况下怎么避免中间人攻击

工程实现过程中,要考虑:

  • 各种可能的缓冲区溢出攻击
  • SYN flood攻击,慢连接攻击
  • DDoS防起来有难度,但至少能防御DoS攻击

业务逻辑层面,要考虑:

  • 每个接口都要做好用户&权限验证
  • 接口会不会被人乱用,重放攻击
  • 攻击方会不会找到一个比较消耗服务端资源的接口,用很小的代价耗尽服务端资源
  • 用户的用户名密码会不会被通过接口破解,参见:2014 celebrity photo hack
  • 你的服务会不会被黑客利用去攻击别的服务,特别是会根据用户输入抓取什么资源的服务
  • 古老的SQL注入
  • 无耻的仿冒服务,DNS欺诈
  • 涉及HTML的,还要考虑跨站……

即使你做到了天衣无缝,还要考虑队友有时会掉链子:

  • glibc、openssl这些基础的库也会爆出漏洞,参见:Heartbleed
  • 同一台主机上的其它服务被攻陷

写完之后整个人都不好了

关于加密解密算法参见:加解密(Encryption)& 哈希(Hash)算法----入门指引 - 面向工资编程 - 知乎专栏

一、Encryption算法和Hash算法的区别

  • 信息论角度:
    • Encryption是可逆的,没有信息熵的改变
    • Hash是不可逆的,Hash一般会导致信息熵减小
  • 应用角度:
    • Encryption常被用来做基于密钥的数据加解密(AES、RSA、ECC)
    • Hash主要被用来做数字签名、数据校验(CRC、SHA、MD5)
  • 小白角度:
    • Encryption就是带密码的保险箱
    • Hash就是榨汁机,有去无回

二、加解密算法分为对称(Symmetric)、非对称(Asymmetry)两大类

  • 对称(Symmetric)加密

    •   对称加密的算法非常之多,一般使用中用AES就基本够用了。

非对称(Asymmetry)加密

  • 非对称加密算法,就是加密、解密的密钥分为两组,并且互相不能反推。这种算法在现实中很难有什么事物可以类比。大致就是通过某种算法可以生成一个密钥对k1、k2,用k1加密之后的密文只能用k2解密,反之亦然。

    非对称加密算法从原理上讲常用的有两种:

  • 基于因数分解的算法
    • RSA、DSA是此类算法中的代表,Linux系统的SSH就是基于这两种算法进行文件key auth。前几年一般建议RSA至少要达到1024位密钥才能保证抵御暴力破解,但由于GPU和超级计算机的算力提升,现在密钥长度建议2048位了。
  • 椭圆曲线算法(ECC)
  • 非对称加密算法非常酷,但它有一个致命的缺点:慢。RSA加密的速度大致是AES的1/30左右。所以我们不可能在所有场合都采用这类加密算法。我们的程序猿前辈们就创造了SSL、TLS等加密体系:

三、加密体系

TLS的前身是SSL,HTTP + TLS = HTTPS

一旦客户端和服务器都同意使用TLS协议,他们通过使用一个握手过程协商出一个有状态的连接以传输数据[1]。通过握手,客户端和服务器协商各种参数用于建立安全连接:

1. 当客户端连接到支持TLS协议的服务器要求建立安全连接并列出了受支持的密码组合(加密密码算法和加密哈希函数),握手开始。

2. 服务器从该列表中决定加密和散列函数,并通知客户端。

3. 服务器发回其数字证书,此证书通常包含服务器的名称、受信任的证书颁发机构(CA)和服务器的公钥。

4. 客户端确认其颁发的证书的有效性。

5. 为了生成会话密钥用于安全连接,客户端使用服务器的公钥加密随机生成的密钥,并将其发送到服务器,只有服务器才能使用自己的私钥解密。

6. 利用随机数,双方生成用于加密和解密的对称密钥。

7. 这就是 TLS 协议的握手,握手完毕后的连接是安全的,直到连接(被)关闭。如果上述任何一个步骤失败,TLS 握手过程就会失败,并且断开所有的连接。

五、盐的重要性

之前在这篇文章中提到过,如果单纯的把文件按块去加密,即使采用最强壮的算法也会存在一个很明显的漏洞,这里不再赘述,参见:用已知加密算法AES加密文本123,得到密文xxx,问能否根据密文、加密算法、原文本123直接推导出密钥是什么? - auxten 的回答

关于哈希函数的选用:

工作中发现,很多人对哈希函数的了解仅限于MD5。例如,在做数据库的分库分表的时候,可能需要对hostname做一次哈希再去取模,这里采用MD5就显得过于浪费CPU。要知道MD5平均会将每个Byte进行6.8次运算代入。

如果只是需要利用哈希的离散型,完全可以采用更轻的哈希算法

时间: 2024-11-06 16:59:59

互联网服务器的实现过程需要考虑哪些安全问题 & 加解密及哈希知识点的相关文章

网络编程四:互联网中TCP Socket服务器的实现过程需要考虑哪些安全问题

这篇曾经是答在这里的 互联网中TCP Socket服务器的实现过程需要考虑哪些安全问题- auxten 的回答 最近总是有人问我相关的问题,在专栏补发一下,希望能帮到更多人 首先,这是个很大的命题,之前在360负责过几个对外的服务的研发,也算是有点小经验,我试着答一下 在Internet环境下安全问题我主要分为如下几类 1. 信息传输过程中被黑客窃取 2. 服务器自身的安全 3. 服务端数据的安全 首先,如果能用https,就尽量用https,能用nginx等常见服务器,就用常见服务器,主要能避

互联网中TCP Socket服务器的实现过程需要考虑哪些安全问题?

首先,这是个很大的命题,之前在Top互联网公司负责过几个对外的服务的研发,也算是有点小经验,我试着答一下: 在Internet环境下,安全问题我主要分为如下几类: 信息传输过程中被黑客窃取 服务器自身的安全 服务端数据的安全 首先,如果能用https,就尽量用https,能用nginx等常见服务器,就用常见服务器,主要能避免以下问题: 自己实现的协议&Server端可能会有各种Bug,被缓冲区溢出攻击等 SSL加密体系在防监听方面已经足够成熟,值得信赖 所幸,私有协议服务的攻击需要黑客分析协议,

基于多进程和基于多线程服务器的优缺点及nginx服务器的启动过程

基于多进程服务器的优点: 1.由操作系统进行调度,运行比较稳定强壮 2.能够方便地通过操作系统进行监控和管理 例如对每个进程的内存变化状况,甚至某个进程处理什么web请求进行监控.同时可以通过给进程发送信号量,实现对应用的各种管理 3.隔离性好 一个进程出现问题只有杀掉它重启就可以,不影响整体服务的可用性 很容易实现在线热部署和无缝升级 不需要考虑线程安全问题 4.充分利用多核cpu,实现并行处理 基于多进程服务器的缺点: 1.内存消耗比较大,每个进程都独立加载完整的应用环境 2.cpu消耗偏高

理解互联网域名请求实现过程,以及Nodejs的http请求小谈

前提:在学习开发互联网网站程序前,需要了解知道一个客户端请求,如何能展现成一个炫丽的网页的. 一.域名请求实现 这幅图足以说明一个域名请求的过程了吧 二.服务器端的处理(Nodejs示例) 直接上nodejs代码 1 var http = require('http'); 2 3 http.createServer(function(req, res) { 4 if (req.method === 'GET') { 5 var html; 6 switch (req.url) { 7 case

java多线程的等待唤醒机制及如何解决同步过程中的安全问题

/* class Person{ String name; String sex; boolean flag = true; public void setPerson(String name, String sex){ this.sex=sex; this.name=name; } } class Input implements Runnable{ int x=0; Person p; Input(Person p){ this.p=p; } public void run(){ while

【转载】浏览器与服务器通信的过程

首先当用户在浏览器的地址栏中敲入了网站的网址 ( 比如: alibaba.com ) ,这时浏览器会首先通过访问的域名来定位到IP (DNS) 从而找到去哪里获取资源, 这时, 浏览器会依次进行如下查找: 1. 浏览器缓存 : 浏览器首先会在自己的缓存中查找有没有对应的域名 – IP匹配, 如果好运的话, 这里就可以直接尝试去访问资源了, 如果运气平平则往下走吧. 2. 系统缓存 : 浏览器缓存中没有命中, 浏览器会告诉操作系统:”嘿, 我在我自己口袋里没找到, 可能丢了, 我得去你那看看”,

java程序模拟浏览器访问Web服务器的处理过程

import java.net.*; import java.io.*; /* * 演示浏览器访问Web服务器的处理过程 */ public class WebServerDemo { public static void main(String[] args)throws IOException{ ServerSocket ss=new ServerSocket(10000); Socket s=ss.accept(); byte[] bytes=new byte[1024]; int len

互联网服务器集群基本概念入门

2019-08-18 关键字:Linux集群.集群服务器.负载均衡集群.高可用集群 互联网的核心组件是各种服务站点.例如购物领域我们有淘宝.京东.拼多多等,出行领域我们有滴滴.首约.货拉拉等,通讯领域则有微信.QQ等.这些服务站点的背后是靠一台台性能出众的电脑来提供各种服务的.但随着互联网所覆盖的人群越来越广.在人们生活中的渗透越来越深,我们每时每刻所发起的服务请求都都是海量的,而单台计算机的计算能力又是极其有限的.为了满足日益增长的计算需求,就产生了一种被称为 “服务器集群” 的计算服务模式.

使用Navicat或者其他数据库工具连接阿里云EDS(数据库服务器)实例过程详解

使用Navicat或者其他数据库工具连接阿里云EDS(数据库服务器)实例过程详解 背景:这几天从阿里云上面购买了云服务器,最垃圾的那种,还送oss和EDS数据库服务器,只不过EDS数据库服务器只有一个月的,就主动升级为一年的,49还是59忘了.对于配置这种EDS过程中,产生的一个念头就是:大厂就是大厂,考虑到用户使用产品的各个方面,都给你解释的清清楚楚,安排的明明白白的.所以,完全可以按照官方给的文档数据库权限用户和创建数据库和表,并使用Navicat连接到远程服务器 自己写文档不给官方文档,实