Linux学习27-加密与安全

标题安全机制

概述

  • gpg工具
  • hase哈希用法
  • 对称与非对称密钥使用

1. 系统安全

  • 莫非定律
    如果两种或两种以上的方式去做某件事情,而其中一种选择方式将导致灾难,则必定有人会做出这种选择。

    1. 任何事都没有表面看起来那么简单;
    2. 所有的事都会比你预计的时间长;
    3. 会出错的事总会出错;
    4. 如果你担心某种情况发生,那么它就更有可能发生

    这里提到莫非定律,是因为它道出了一个铁的事实:技术风险能够由可能性变为突发性的事实

  • 信息安全防护的目标

    1. 保密性 Confidentiality
      避免泄漏信息
    2. 完整性 Integrity
      数据不能被串改,保证原样
    3. 可用性 Usability
      让系统可以长期稳定运行
    4. 可控制性 Controlability
      系统要处于可控范围
    5. 不可否认性 Non-repudiation
      相当于事件实名制
  • 安全防护环节

    1. 物理安全:各种设备/主机、机房环境
    2. 系统安全:主机或设备的操作系统,比如设置系统口令,acl权限等
    3. 应用安全:各种网络服务、应用程序,例如数据库,web服务,保证非法用户不能访问
    4. 网络安全:对网络访问的控制、防火墙规则
    5. 数据安全:信息的备份与恢复、加密解密
    6. 管理安全:各种保障性的规范、流程、方法
  • 安全攻击: STRIDE

    1. S:Spoofing 假冒
    2. T: 篡改(Tampering)

      示例: 冒充邮件 telnet 127.0.0.1 25
      这里写图片描述

    3. R:否认(Repudiation)
    4. I :信息泄漏(Information Disclosure)

      例如:使用telnet连接其它主机时,输入的密码是明文的,会被抓包获取

    5. D:拒绝服务(Denial of Service)

      例如:耗尽服务器资源,拒绝他人访问

    6. E:提升权限(Elevation of Privilege)

      通过脚本串改用户权限为管理员

  • 安全设计基本原则

    1. 使用成熟的安全系统
    2. 以小人之心度输入数据

      SQL注入,构建特殊输入,绕过安全检查SQL注入,构建特殊输入,绕过安全检查
      例如:登录某些服务时,需要验证用户名和密码
      1:正常格式为
      username=’ ’ and password=’ ’
      2:构造特殊密码
      username=’ ’ and password=’ ‘or’1’=‘1 ’
      3:密码改为空或者1=1,绕过检测
      password=’ ’ or ‘1’=‘1’

      扫描二维码关注公众号,回复: 3273085 查看本文章
    3. 外部系统是不安全的

      通常认为外部的网络是不安全的,企业中接入外网通常要加防火墙,企业中内网安装防水墙,放置拷贝数据,以及记录移动设备连接状态

    4. 最小授权

      只要能满足要求就可以,能小则小

    5. 减少外部接口
    6. 缺省使用安全模式

      selinux

    7. 安全不是似是而非
    8. 从STRIDE思考
    9. 在入口处检查
    10. 从管理上保护好你的系统
  • 常用安全技术

    1. 认证 验证身份
    2. 授权 给予权限
    3. 审计 记录操作内容
    4. 安全通信 操作过程中保证信息安全
  • 密码算法和协议

    1. 对称加密
    2. 公钥加密
    3. 单向加密
    4. 认证协议

2. 对称加密算法

  • 特点

    1. 算法可以公开
    2. key不公开,不同的密钥+相同的算法
    3. 加密和解密使用同一个密钥,效率高,适合加密大量数据
    4. 将原始数据分割成固定大小的块,逐个进行加密
  • 缺点

    1. 密钥过多

      每对用户每次使用对称加密算法时,都需要使用其他人不知道的惟一钥匙,这会使得发收信双方所拥有的钥匙数量呈几何级数增长

    2. 密钥分发困难

      将密钥告知对方的安全渠道问题,除非提前约定密钥,而密钥需要经常变更,依然是传输问题

    3. 数据来源无法确认

      数据缺少数字签名,不易确定数据来源

  • 常见对称加密算法

    1. DES:Data Encryption Standard,通过56bits的密钥来实现
    2. 3DES:3次DES加密算法
    3. AES:Advanced (128, 192, 256bits)目前主流的
    4. Blowfish,Twofish商业公司
    5. IDEA,RC6,CAST5商业

3. 非对称密钥加密

非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey)

3.1 简介

  • 概念
    公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法

  • 公钥(public key):可以公开给所有人

    例如/etc/ssh下,以key.pub结尾的为公钥,ssh_host_ecdsa_key.pub

  • 私钥(private key):自己留存,必须保证其私密性,以key结尾的是私钥

    例如/etc/ssh下,以key结尾的为公钥,ssh_host_ecdsa_key

  • 特点:

    1. 用公钥加密数据,只能使用与之配对的私钥解密;反之亦然
    2. 公钥是不可能推算出私钥
  • 功能:

    1. 数字签名

      主要在于让接收方确认发送方身份

    2. 对称密钥交换

      发送方用对方的公钥加密一个对称密钥后发送给对方

    3. 数据加密

      适合加密较小数据

  • 缺点
    密钥长,加密解密效率低下

  • 算法

    1. RSA(加密,数字签名)
    2. DSA(数字签名)
    3. ELGamal

3.2 工作流程

  • 用到的关键字
    发送方拥有的公钥(P1)私钥(S1)
    接收方拥有的公钥(P2)私钥(S2)
    传送的信息以D表示
  • 流程
    1. 接收者
      公布公钥信息P2
    2. 发送者
      1. 用自己的私钥为信息D加上数字签名得到S1(D)
      2. 使用接收者的公钥来加密信息P2[S1(D)]
      3. 发布自己的公钥信息P1
      4. 将P2[S1(D)]发送给接收者
    3. 接收者
      1. 取得发送者的公钥信息P1
      2. 使用自己私钥S2来解密公钥P2得到[S1(D)]
      3. 使用发送者公钥解除私钥S1得到D

3.3 Hash(哈希算法)-单向散列算法

通过hash算法对一个数据做运算,得出一个摘要(digest)只要数据不同,得出的摘要必将不同,数据相同,digest必相同,不可反推出数据,不管多大的文件,摘要的长度是固定不变的,此长度和算法有关

  • 特点

    1. 将任意数据缩小成固定大小的“指纹”
      1. 任意长度输入
      2. 固定长度输出
    2. 若修改数据,指纹也会改变(“不会产生冲突”)
    3. 无法从指纹中重新生成数据(“单向”)
  • 功能
    数据完整性

    文件A与文件B,大小都为1G,想要比较两个文件内容是否相同,只需要做哈西运算,比较哈希值

  • 常见算法

    1. md5: 128bits
    2. sha1: 160bits
      sha224 、sha256、sha384、sha512(centos中密码加密显示的 6 6 )
  • 常用工具

    1. md5sum | sha1sum [ --check ] file
    2. openssl、gpg
    3. rpm -V
  • 示例

示例1. 基本格式

1. sha1sum算法
[root@hai7 ~]$sha1sum  /dev/sr0
4eead850afed0fc7d170c23bfabfed379419db79  /dev/sr0
2. md5sum算法
[root@hai7 ~]$md5sum  /dev/sr0

示例2:–check选项,比对文件完整性

3. 将文件f2的哈希值保存至文件f4中
$sha1sum f2 > f4
4. 将文件f3的哈希值追加至文件f4中
$sha1sum f3 >> f4
5. 修改文件f2
$vim f2
6. 比较文件完整性
$sha1sum  --check  f4
f2: FAILED    <==计算校验不匹配
f3: OK

3.3 非对称加密优化

  • 目的
    通过哈希运算,将需要数字签名的信息缩减,优化解密数字签名时间
  • 用到的关键字
    发送方拥有的公钥(P1)私钥(S1)
    接收方用用的公钥(P2)私钥(S2)
    传送的信息以D表示
    哈希值以H表示
  • 流程
    1. 接收方
      公布公钥信息P2
    2. 发送方
      1. 取得接受者的公钥信息P2
      2. 通过哈希运算得到数据D的哈希值H1,用发送者私钥S1为哈希值加密的到S1(H1)
      3. 使用接收者公钥为数据D和S1(H1)加密,得到P2[D+S1(H1)]
      4. 发布自己的公钥信息P1
      5. 将P2[D+S1(H1)]发送给接收者
    3. 接收方
      1. 取得发送者的公钥信息P1
      2. 使用自己私钥S2来解密公钥P2得到[D+S1(H1)]
      3. 使用发送者公钥解除私钥S1得到H1
      4. 哈希运算信息D得到哈希值H2,对比H1与H2,确认信息是否被修改过

3.4 对称与非对称密钥组合使用

  • 目的
    结合对称与非对称密钥,优化接收方解密信息D时所需时间
  • 用到的关键字
    发送方拥有的公钥(P1)私钥(S1)
    接收方用用的公钥(P2)私钥(S2)
    传送的信息以D表示
    哈希值以H表示
    对称公钥以K表示
  • 流程
    1. 接收者
      公布公钥信息P2
    2. 发送者
      1. 指定对称公钥K
      2. 取得接收者的公钥信息P2
      3. 通过哈希运算得到数据D的哈希值H1,用发送者私钥S1为哈希值加密的到S1(H1)
      4. 使用对称公钥K为数据D和S1(H1)加密得到K[D+S1(H1)]
      5. 使用接收者公钥P2为K加密,得到P2-K[D+S1(H1)]
      6. 发送P2-K[D+S1(H1)]给接收者
      7. 发布自己的公钥信息P1
    3. 接收者
      1. 取得发送方的公钥信息P1
      2. 使用自己的私钥S2来解密公钥P2得到对称公钥K
      3. 使用对称公钥K来解密数据,得到D+S1(H1)
      4. 使用发送方的公钥P1解密,得到H1
      5. 接收者通过哈希信息D得到哈希值H2,对比H1与H2,确认信息是否被修改过

4. 密钥交换

此算法前提是A与B是相互可信的,如果A与B有中间人C,就可能造成中间人攻击,也就是C欺骗A与B,可通过非对称密钥解决

  • 简介
    密钥交换:IKE( Internet Key Exchange )
    由惠特菲尔德·迪菲(Bailey Whitfield Diffie)和马丁·赫尔曼(Martin Edward Hellman)在1976年发表
    参看:https://en.wikipedia.org/wiki/Diffie–Hellman_key_exchange

  • 工作原理
    DH (Deffie-Hellman):生成会话密钥

    1. 协商生成公开的整数g, 大素数p
    2. 各自生成隐私数据
      1. A:各自生成隐私数据 :a (a<p ),计算得出 g^a%p,发送给B,只有自己指定隐式数据
      2. B:生成隐私数据 :b,计算得出 g^b%p,发送给A
    3. 生成为密钥
      1. A:计算得出 [(g^b %p)^a] %p = g^ab%p,生成为密钥
      2. B:计算得出 [(g^a %p)^b] %p = g^ab%p,生成为密钥
  • 示例

假设g=6  p=23  a=5  b=9
A:6^5%23=2  →B 2^9%23=6
B:6^9%23=16 →A 16^5%23=6

5. 使用gpg命令-实现对称加密

  • 格式
    1. 加密
      gpg -c file
    2. 在另一台主机上解密file
      gpg -d file.gpg 只显示出来,不会另存
      gpg -o file -d file.gpg 将文件另存至文件file中
  • 示例
    1. 为文件f1加密
      gpg -c f1
      输入2次密码
      这里写图片描述

    2. 生成f1.gpg,查看以乱码显示

      [root@hai7 /data]$cat f1.gpg 
      ߉Wحs饥ᢆ><ԧÿT²ô韃»dЮµDǼFI˲ꏆZ㏠֨?¡c¦·¸r,«,k¦©] 
      
    3. 发送给另外一台主机

      [root@hai7 /data]$scp f1.gpg 172.20.129.251:/data
      
    4. 解密,并生成新文件f1,解密同样弹出上述画面,输入正确口令解密
      gpg -o f1 -d f1.gpg

6. 使用gpg工具实现公钥加密

  • 在hostB主机上用公钥加密,在hostA主机上解密
  1. 在hostA主机上生成公钥/私钥对
    gpg --gen-key
[root@hai6  /data]$gpg --gen-key
......省略
Please select what kind of key you want:
   (1) RSA and RSA (default)            <==选择非对称密钥加密算法,默认RSA
   (2) DSA and Elgamal
   (3) DSA (sign only)
   (4) RSA (sign only)
Your selection?                         <==回车,选择默认
What keysize do you want? (2048) 1024   <==选择密钥长度,1024-4096,默认2048
Please specify how long the key should be valid.
         0 = key does not expire        <==永不过期
      <n>  = key expires in n days
      <n>w = key expires in n weeks
      <n>m = key expires in n months
      <n>y = key expires in n years
Key is valid for? (0)                  <==选择有效期
Is this correct? (y/N)  y
GnuPG needs to construct a user ID to identify your key.
Real name: wange                       <==为密钥指定所属,最少5个字节
Email address:                         <==邮箱地址,跳过
comment:						       <==描述信息,跳过
Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit?  O
  1. 大O确定,输入其他对应字母可修改相应信息,弹出下图
    需要输入一个保护私钥的密码,这里做实验就不设置口令了
    这里写图片描述

  2. 密钥生成会放在/root/.gnupg下

[root@hai6  ~/.gnupg]$ll
total 32
-rw-------. 1 root root 7856 Sep  9 09:20 gpg.conf
drwx------  2 root root 4096 Sep 15 23:52 private-keys-v1.d
-rw-------  1 root root  648 Sep 16 00:17 pubring.gpg    <==公钥文件
-rw-------  1 root root  648 Sep 16 00:17 pubring.gpg~
-rw-------  1 root root  600 Sep 16 00:17 random_seed
-rw-------  1 root root 1388 Sep 16 00:17 secring.gpg    <==私钥文件
-rw-------. 1 root root 1280 Sep 16 00:17 trustdb.gpg
  1. 在hostA主机上查看公钥,这时候公钥是二进制的,需要导出为可以阅读的文本格式
[root@hai7 /data]$gpg --list-keys
/root/.gnupg/pubring.gpg
------------------------
pub   1024R/568142B1 2018-09-16
uid                  magedu
sub   1024R/B91149D8 2018-09-16

  1. 在hostA主机上导出公钥到文件(自定义名称),文件为base64编码
转换公钥命令
[root@localhost  ~/.gnupg]$gpg -a --export -o v9.pubkey
转换私钥
[root@localhost  ~/.gnupg]$gpg -a --export-secret-keys  -o v9.key
-a:表示转换为ASCII文本格式,也就是易读格式
--export:导出公钥
--export-secret-keys:导出私钥
-o:导出的目标文件
  1. 从hostA主机上复制公钥文件到需加密的B主机/data目录下
    $scp v9.pubkey 172.20.50.121:/data
  1. 在需加密数据的hostB主机上生成公钥/私钥对
$gpg --gen-key    <==这步可以省略,这里是为后续删除准备
  1. 在hostB主机上导入公钥
[root@hai7 ~/.gnupg]$gpg  --import   /data/v9.pubkey 
[root@hai7 ~/.gnupg]$gpg  --list-keys
/root/.gnupg/pubring.gpg
------------------------
pub   1024R/D6A9BFED 2018-09-18
uid                  molihua
sub   1024R/9AC8E06E 2018-09-18

pub   1024R/35542F26 2018-09-18
uid                  shanwuyu                  <==增加的公钥
sub   1024R/6C14A9F5 2018-09-18
  1. 用从hostA主机导入的公钥,加密hostB主机的文件f2,生成f2.gpg
[root@hai7 /data]$gpg -e -r shanwuyu f2
系统会提醒是否确认拿到的公钥是正确的
Use this key anyway? (y/N)    <==确认无误,输入y
选项-e:表示加密
	-r:表示选择加密公钥,跟公钥UID
  1. 复制加密文件到hostA主机
$scp  f2.gpg  172.20.50.100:/data
  1. 在hostA主机解密文件
解密文件,在屏幕上打印
$gpg -d f2.gpg  
解密文件并生成新文件f2
$gpg -o f2 -d f2.gpg  
选项-o:将输出写入文件
    -d:   解压文件
  1. 删除公钥和私钥
    想要删除导入的公钥,可以使用如下命令来指定需要删除的公钥UID,本机的公钥想要删除,会提示先删除私钥。
    • 删除公钥
      gpg --delete-keys uid
    • 删除私钥
      gpg --delete-secret-keys uid
[root@hai7 /data]$gpg --delete-keys shanwuyu
[root@hai7 /data]$gpg --list-keys
/root/.gnupg/pubring.gpg
------------------------
pub   1024R/D6A9BFED 2018-09-18       
uid                  molihua                 <==只删除了uid为shanwuyu的公钥
sub   1024R/9AC8E06E 2018-09-18

7. 使用gpg工具签名

不对称加密中提到信息签名,来确保信息可靠性,利用gpg可以实现

  • 为文件签名
    • 选项
      -s|sign:数字签名,二进制格式
      –clearsign:清晰签名,文本中的内容是可读的
[root@hai7 /data]$gpg --sign f1
输入命令后会提示解锁密钥,解锁后生成文件f1.gpg,二进制格式的
[root@hai7 /data]$gpg --clearsign f1
生成f1.asc,是base64编码格式的
  • 加密并签名
    • 格式:
      gpg <–local-user> <私钥uid> <–recipient> <目标公钥uid> -a --sign -e fire
    • 选项:
      –local-user:数字签名发送方自己的私钥uid
      –recipient:发送目标公钥uid
      -a:表示base64编码输出
      -s|–sign:表示为数字签名
      -e:表示加密
1:在发送方主机上加密文件并签名
[root@hai7 /data]$gpg --local-user molihua --recipient shanwuyu -a --sign -e f2
2:在目标主机上解密文件                
[root@localhost  /data]$gpg -d f2.asc
与没有签名的文件对比,会多出一下行    <==
gpg: Signature made Tue 18 Sep 2018 09:06:43 PM CST using RSA key ID D6A9BFED
gpg: Good signature from "molihua"

猜你喜欢

转载自blog.csdn.net/free050463/article/details/82728420
今日推荐