今开始进入linux学习的第二阶段了,服务器的架设。
    说到服务器,就不得不说说安全问题,现今数据安全所面临的问题大致分为三类:窃听,数据注入和会话劫持。所以针对这三个问题就引入了了我们今天的主要话题:加密!
    如果不解决网络的安全,电子商务也不会深入我们的生活,给我们带来各种方便。要解决这些问题,就必须给数据加密,加密依赖于加密算法。加密的实现就是把明文转换成密文,那就要基于加密算法机制来转换了,加密算法根据某种逻辑把明文转换成不可逆的密文。
    加密主要有三种方式:对称加密,公钥加密和单向加密。
    对称加密:加密方和解密方使用同一个密钥,发送方把数据结合某种算法,并通过密钥生成一段密文(code),接收方收到这段密文后基于同一种算法机制,并用同一个密钥,还原这段密文,使其转换成明文。但是对称加密有密钥交换方面的局限性,尽管它的加密速度很快。
 发送方:数据(加密算法,密钥)——>密文(code)
 接收方:密文(解密算法,密钥)——>明文
    公钥加密:基于公钥加密的用户生成的是一对密钥,一个是公钥,可以公开的;一个是私钥,只有用户本人可以留存。一段数据如果用公钥加密只能使用与之配对的私钥解密,反之亦然,私钥加密的话只能用与之匹配的公钥解密,可以实现密钥交换,但是它也有局限性:公钥加密非常慢,效率很低。
   data-->pk -->code
  code-->sk -->data
    单向加密:它最主要的作用就是保护数据的完整性,防止被恶意改动。它的主要机制是获取数据的特征码。单向加密本身特征:定长输出;不可逆;雪崩效应(输入数据的微小改变会导致输出数据的巨大改变)。 单单依靠数据的特征码,还是会被恶意篡改,如果发送方用自己的私钥对这段数据以及它的特征码加密,接受方用发送方的公钥解密,就实现了身份验证,就算校验码和数据被恶意篡改,但被改动后的这段数据不能用发送方的私钥加密,这样就保证了数据的完整性。但却不能保证数据的保密性,又是一个局限性。
    综上,要想实现数据传输过程中的安全,首先,发送方生成一段数据,用单向加密计算出数据的特征码,实现数据的完整性,为了自己的身份得到接收方的验证,发送方需要用自己的私钥对数据和数据的特征码进行加密,同时为了保证这段数据只有接收方能够看到,发送方需要生成一对对称密钥对数据及刚才所做的整体数据进行加密,使其转换为一段密文,然后,为了使接收方得到这个对称密钥,发送方要用接收方的公钥加密整段数据,发送!
    接受方对接受的数据怎么处理呢?首先,用自己的私钥解密整段数据,就可以得到对称密钥了,然后用这个密钥把密文转换为明文,再用发送方的公钥解密数据外特征码,对发送方进行身份验证,最后用单向算法解密数据特征码,以保障数据的完整性,好了,数据传输成功!
    从数据传输的整个过程中可以看出发送方与接收方都要用到对方的公钥。那怎么得到真正的公钥而不是恶意的呢?就要通过双方都信任的第三方机构了:CA,证书颁发机构。
    证书分为用户证书和主机证书,里面存放的是持有人的信息和用户的公钥,证书内容最重要的就是公钥。CA为保证权威性,最主要的措施是数字签名。证书具有有效期,所以要定期的查看证书撤销列表,虽然安全无法绝对保证,在某种程度上的可靠机制还是可以实现的。在互联网的公共安全方面有一个规范,那就是公钥基础设施PKI,PKI的核心就是CA。公钥的真实性得以解决,那就剩最后一层安全保障了,那就是给自己的私钥加密。
    说过了加密方法,来说说加密算法,首先是DES,叫数据加密标准,随着计算机计算能力的提高,这种算法被提升为3DES,3倍于DES的算法,真正的高级算法是AES,除了这些还有就是Blowfish。
    在linux上的加密算法:openssl enc ,gpg;可以实现公钥加密的算法有RSA,ELGamal,而只能实现签名的是DSA算法;公钥加密的工具:gpg.openssl.
    可以实现单向加密的算法有MD5,SHA1,CRC-32;单向加密的常用工具有md5sun,sha1sun,openssl dgst。
    openssl是linux上非常重要的网络安全工具,它主要由三部分组成,其中两个是库,一个是加密库,经常被其他要用到加密功能的服务器所调用,第二个库是在linux实现基于会话的安全的库,经常被基于C/S的服务器所调用;第三部分是openssl,是多功能的加密工具,提供对称加密,公钥加密和单向加密,还可以作为本地CA使用,在企业内部自建CA。
    openssl是一个命令行工具,#openssl version可以查看openssl的版本;使用#openssl可以进入openssl的命令行模式,输入错误信息时,输出所有openssl的所有用法;#openssl speed是对加密算法的速率测试的。
    怎样用openssl对数据进行加密呢?
     #openssl enc -des3 -salt -a -in plaintext -out ciphertext.des3
       -des3   表示所使用的加密算法
       -salt   表示加入salt
       -a      表示asc码,输出的是asc码
       -in plaintext  表示从哪个文件读入
       -out ciphertext.des3  表示加密的结果是什么,保存在什么地方
     怎样解密呢?只需要在enc后加上-d选项,然后互换输入和输出:
  #openssl enc -des3 -salt -a -in ciphertext.des3 -out plaintext
    当然了,上面的例子中也可以换成别的算法,那么上例中的salt是从哪得来的呢?是随机数,所有随机数对于整个的加密和解密很重要!随机数的主要来源:熵池和伪随机数。随机数生成器有两个:/dev/random,随机数保存在熵池中;/dev/urandom,随机数保存在熵池和伪随机数中。伪随机数是一个软件。
    openssl子命令rand也可以取得随机数,使用[-base64]进行编码,如:
 #openssl rand 123
 #openssl rand -base64 123 
输出的是经过base64编码以后的结果
    “openssl base64”还可以对指定字符进行编码,它是一种可以将任何数据编码成文本数据的工具,如:
 #echo -n "redhat" | openssl base64
     如何计算一段数据或文件的哈希值呢?常用的工具有md5sum和shalsum,他们计算出的校验码长度不同,如:
 [root@localhost ~]# md5sum analyzelog.sh
 99755abbd70976bc0de860c6a619fc78  analyzelog.sh
  [root@localhost ~]# sha1sum analyzelog.sh
 c297bd7643dea4a99514395cb8709857e02a8f5f  analyzelog.sh
    "openssl dgst"命令也能计算出文件的哈希值,还以上面的文件为例:
 [root@localhost ~]# openssl dgst -sha1 analyzelog.sh
 SHA1(analyzelog.sh)= c297bd7643dea4a99514395cb8709857e02a8f5f
 dgst 表示信息摘要算法
 -sha1 指定算法,可以看出与上例中shha1sum计算出的结果一样
    openssl passwd :用于给用户生成密码。
    在公钥加密中,“openssl genrsa”可以用于生成密钥,如:
 [root@localhost ~]# openssl genrsa 1024 > mykey.sec
 1024指密钥的长度,所以它的加密速度比较慢,生成密钥后直接把它保存到一个文件里,它还可以写成:
  [root@localhost ~]# openssl genrsa -des3 -out mykey.sec 1024
 注:上面这条命令不但生成了密钥,还给它加了密!
 公钥与私钥是成对的,它就在私钥中,可以提取出来:
 [root@localhost ~]# openssl rsa -in mykey.sec -pubout
    密钥文件的权限必须是600的,以保证它的保密性!也可以在生成密钥时直接指定它的权限 : [root@localhost ~]# (umask 077; openssl genrsa 1024 > gttp.key)