标题安全机制
概述
- gpg工具
- hase哈希用法
- 对称与非对称密钥使用
1. 系统安全
-
莫非定律
如果两种或两种以上的方式去做某件事情,而其中一种选择方式将导致灾难,则必定有人会做出这种选择。- 任何事都没有表面看起来那么简单;
- 所有的事都会比你预计的时间长;
- 会出错的事总会出错;
- 如果你担心某种情况发生,那么它就更有可能发生
这里提到莫非定律,是因为它道出了一个铁的事实:技术风险能够由可能性变为突发性的事实
-
信息安全防护的目标
- 保密性 Confidentiality
避免泄漏信息 - 完整性 Integrity
数据不能被串改,保证原样 - 可用性 Usability
让系统可以长期稳定运行 - 可控制性 Controlability
系统要处于可控范围 - 不可否认性 Non-repudiation
相当于事件实名制
- 保密性 Confidentiality
-
安全防护环节
- 物理安全:各种设备/主机、机房环境
- 系统安全:主机或设备的操作系统,比如设置系统口令,acl权限等
- 应用安全:各种网络服务、应用程序,例如数据库,web服务,保证非法用户不能访问
- 网络安全:对网络访问的控制、防火墙规则
- 数据安全:信息的备份与恢复、加密解密
- 管理安全:各种保障性的规范、流程、方法
-
安全攻击: STRIDE
- S:Spoofing 假冒
- T: 篡改(Tampering)
示例: 冒充邮件 telnet 127.0.0.1 25
- R:否认(Repudiation)
- I :信息泄漏(Information Disclosure)
例如:使用telnet连接其它主机时,输入的密码是明文的,会被抓包获取
- D:拒绝服务(Denial of Service)
例如:耗尽服务器资源,拒绝他人访问
- E:提升权限(Elevation of Privilege)
通过脚本串改用户权限为管理员
-
安全设计基本原则
- 使用成熟的安全系统
- 以小人之心度输入数据
SQL注入,构建特殊输入,绕过安全检查SQL注入,构建特殊输入,绕过安全检查
例如:登录某些服务时,需要验证用户名和密码
1:正常格式为
username=’ ’ and password=’ ’
2:构造特殊密码
username=’ ’ and password=’ ‘or’1’=‘1 ’
3:密码改为空或者1=1,绕过检测
password=’ ’ or ‘1’=‘1’ - 外部系统是不安全的
通常认为外部的网络是不安全的,企业中接入外网通常要加防火墙,企业中内网安装防水墙,放置拷贝数据,以及记录移动设备连接状态
- 最小授权
只要能满足要求就可以,能小则小
- 减少外部接口
- 缺省使用安全模式
selinux
- 安全不是似是而非
- 从STRIDE思考
- 在入口处检查
- 从管理上保护好你的系统
-
常用安全技术
- 认证 验证身份
- 授权 给予权限
- 审计 记录操作内容
- 安全通信 操作过程中保证信息安全
-
密码算法和协议
- 对称加密
- 公钥加密
- 单向加密
- 认证协议
2. 对称加密算法
-
特点
- 算法可以公开
- key不公开,不同的密钥+相同的算法
- 加密和解密使用同一个密钥,效率高,适合加密大量数据
- 将原始数据分割成固定大小的块,逐个进行加密
-
缺点
- 密钥过多
每对用户每次使用对称加密算法时,都需要使用其他人不知道的惟一钥匙,这会使得发收信双方所拥有的钥匙数量呈几何级数增长
- 密钥分发困难
将密钥告知对方的安全渠道问题,除非提前约定密钥,而密钥需要经常变更,依然是传输问题
- 数据来源无法确认
数据缺少数字签名,不易确定数据来源
- 密钥过多
-
常见对称加密算法
- DES:Data Encryption Standard,通过56bits的密钥来实现
- 3DES:3次DES加密算法
- AES:Advanced (128, 192, 256bits)目前主流的
- Blowfish,Twofish商业公司
- 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
-
特点:
- 用公钥加密数据,只能使用与之配对的私钥解密;反之亦然
- 公钥是不可能推算出私钥
-
功能:
- 数字签名
主要在于让接收方确认发送方身份
- 对称密钥交换
发送方用对方的公钥加密一个对称密钥后发送给对方
- 数据加密
适合加密较小数据
- 数字签名
-
缺点
密钥长,加密解密效率低下 -
算法
- RSA(加密,数字签名)
- DSA(数字签名)
- ELGamal
3.2 工作流程
- 用到的关键字
发送方拥有的公钥(P1)私钥(S1)
接收方拥有的公钥(P2)私钥(S2)
传送的信息以D表示 - 流程
- 接收者
公布公钥信息P2 - 发送者
- 用自己的私钥为信息D加上数字签名得到S1(D)
- 使用接收者的公钥来加密信息P2[S1(D)]
- 发布自己的公钥信息P1
- 将P2[S1(D)]发送给接收者
- 接收者
- 取得发送者的公钥信息P1
- 使用自己私钥S2来解密公钥P2得到[S1(D)]
- 使用发送者公钥解除私钥S1得到D
- 接收者
3.3 Hash(哈希算法)-单向散列算法
通过hash算法对一个数据做运算,得出一个摘要(digest)只要数据不同,得出的摘要必将不同,数据相同,digest必相同,不可反推出数据,不管多大的文件,摘要的长度是固定不变的,此长度和算法有关
-
特点
- 将任意数据缩小成固定大小的“指纹”
- 任意长度输入
- 固定长度输出
- 若修改数据,指纹也会改变(“不会产生冲突”)
- 无法从指纹中重新生成数据(“单向”)
- 将任意数据缩小成固定大小的“指纹”
-
功能
数据完整性文件A与文件B,大小都为1G,想要比较两个文件内容是否相同,只需要做哈西运算,比较哈希值
-
常见算法
- md5: 128bits
- sha1: 160bits
sha224 、sha256、sha384、sha512(centos中密码加密显示的 )
-
常用工具
- md5sum | sha1sum [ --check ] file
- openssl、gpg
- 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表示 - 流程
- 接收方
公布公钥信息P2 - 发送方
- 取得接受者的公钥信息P2
- 通过哈希运算得到数据D的哈希值H1,用发送者私钥S1为哈希值加密的到S1(H1)
- 使用接收者公钥为数据D和S1(H1)加密,得到P2[D+S1(H1)]
- 发布自己的公钥信息P1
- 将P2[D+S1(H1)]发送给接收者
- 接收方
- 取得发送者的公钥信息P1
- 使用自己私钥S2来解密公钥P2得到[D+S1(H1)]
- 使用发送者公钥解除私钥S1得到H1
- 哈希运算信息D得到哈希值H2,对比H1与H2,确认信息是否被修改过
- 接收方
3.4 对称与非对称密钥组合使用
- 目的
结合对称与非对称密钥,优化接收方解密信息D时所需时间 - 用到的关键字
发送方拥有的公钥(P1)私钥(S1)
接收方用用的公钥(P2)私钥(S2)
传送的信息以D表示
哈希值以H表示
对称公钥以K表示 - 流程
- 接收者
公布公钥信息P2 - 发送者
- 指定对称公钥K
- 取得接收者的公钥信息P2
- 通过哈希运算得到数据D的哈希值H1,用发送者私钥S1为哈希值加密的到S1(H1)
- 使用对称公钥K为数据D和S1(H1)加密得到K[D+S1(H1)]
- 使用接收者公钥P2为K加密,得到P2-K[D+S1(H1)]
- 发送P2-K[D+S1(H1)]给接收者
- 发布自己的公钥信息P1
- 接收者
- 取得发送方的公钥信息P1
- 使用自己的私钥S2来解密公钥P2得到对称公钥K
- 使用对称公钥K来解密数据,得到D+S1(H1)
- 使用发送方的公钥P1解密,得到H1
- 接收者通过哈希信息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):生成会话密钥- 协商生成公开的整数g, 大素数p
- 各自生成隐私数据
- A:各自生成隐私数据 :a (a<p ),计算得出 g^a%p,发送给B,只有自己指定隐式数据
- B:生成隐私数据 :b,计算得出 g^b%p,发送给A
- 生成为密钥
- A:计算得出 [(g^b %p)^a] %p = g^ab%p,生成为密钥
- 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命令-实现对称加密
- 格式
- 加密
gpg -c file - 在另一台主机上解密file
gpg -d file.gpg 只显示出来,不会另存
gpg -o file -d file.gpg 将文件另存至文件file中
- 加密
- 示例
-
为文件f1加密
gpg -c f1
输入2次密码
-
生成f1.gpg,查看以乱码显示
[root@hai7 /data]$cat f1.gpg ߉Wحs饥ᢆ><ԧÿT²ô韃»dЮµDǼFI˲ꏆZ㏠֨?¡c¦·¸r,«,k¦©]
-
发送给另外一台主机
[root@hai7 /data]$scp f1.gpg 172.20.129.251:/data
-
解密,并生成新文件f1,解密同样弹出上述画面,输入正确口令解密
gpg -o f1 -d f1.gpg
-
6. 使用gpg工具实现公钥加密
- 在hostB主机上用公钥加密,在hostA主机上解密
- 在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
-
大O确定,输入其他对应字母可修改相应信息,弹出下图
需要输入一个保护私钥的密码,这里做实验就不设置口令了
-
密钥生成会放在/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
- 在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
- 在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:导出的目标文件
- 从hostA主机上复制公钥文件到需加密的B主机/data目录下
$scp v9.pubkey 172.20.50.121:/data
- 在需加密数据的hostB主机上生成公钥/私钥对
$gpg --gen-key <==这步可以省略,这里是为后续删除准备
- 在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
- 用从hostA主机导入的公钥,加密hostB主机的文件f2,生成f2.gpg
[root@hai7 /data]$gpg -e -r shanwuyu f2
系统会提醒是否确认拿到的公钥是正确的
Use this key anyway? (y/N) <==确认无误,输入y
选项-e:表示加密
-r:表示选择加密公钥,跟公钥UID
- 复制加密文件到hostA主机
$scp f2.gpg 172.20.50.100:/data
- 在hostA主机解密文件
解密文件,在屏幕上打印
$gpg -d f2.gpg
解密文件并生成新文件f2
$gpg -o f2 -d f2.gpg
选项-o:将输出写入文件
-d: 解压文件
- 删除公钥和私钥
想要删除导入的公钥,可以使用如下命令来指定需要删除的公钥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"