详解OpenSSL中的加密算法指令(备份Gerrit库代码)

 

 

 

1、对称加密算法概述
openssl的加密算法库提供了丰富的对称加密算法,我们可以通过openssl提供的对称加密算法指令的方式使用,也可以通过调用openssl提供的API的方式使用。
openssl的对称加密算法指令主要用来对数据进行加密和解密处理,openssl基本上为所有其支持的对称加密算法都提供了指令的方式的应用,
这些应用指令的名字基本上都是以对称加密算法本身的名字加上位数、加密模式或者其他属性组合而成。
例如DES算法的CBC模式,其对应的指令就是des-cbc。
可以通过命令查看当前版本的openssl支持的对称加密算法,例如CentOS7 openssl版本及支持对称加密算法指令如下:
[root@backup ~]# openssl enc --help
unknown option '--help'
options are
-in <file>     input file
-out <file>    output file
-pass <arg>    pass phrase source
-e             encrypt
-d             decrypt
-a/-base64     base64 encode/decode, depending on encryption flag
-k             passphrase is the next argument
-kfile         passphrase is the first line of the file argument
-md            the next argument is the md to use to create a key
                 from a passphrase. See openssl dgst -h for list.
-S             salt in hex is the next argument
-K/-iv         key/iv in hex is the next argument
-[pP]          print the iv/key (then exit if -P)
-bufsize <n>   buffer size
-nopad         disable standard block padding
-engine e      use engine e, possibly a hardware device.
Cipher Types
-aes-128-cbc               -aes-128-cbc-hmac-sha1     -aes-128-cfb              
-aes-128-cfb1              -aes-128-cfb8              -aes-128-ctr              
-aes-128-ecb               -aes-128-gcm               -aes-128-ofb              
-aes-128-xts               -aes-192-cbc               -aes-192-cfb              
-aes-192-cfb1              -aes-192-cfb8              -aes-192-ctr              
-aes-192-ecb               -aes-192-gcm               -aes-192-ofb              
-aes-256-cbc               -aes-256-cbc-hmac-sha1     -aes-256-cfb              
-aes-256-cfb1              -aes-256-cfb8              -aes-256-ctr              
-aes-256-ecb               -aes-256-gcm               -aes-256-ofb              
-aes-256-xts               -aes128                    -aes192                   
-aes256                    -bf                        -bf-cbc                   
-bf-cfb                    -bf-ecb                    -bf-ofb                   
-blowfish                  -camellia-128-cbc          -camellia-128-cfb         
-camellia-128-cfb1         -camellia-128-cfb8         -camellia-128-ecb         
-camellia-128-ofb          -camellia-192-cbc          -camellia-192-cfb         
-camellia-192-cfb1         -camellia-192-cfb8         -camellia-192-ecb         
-camellia-192-ofb          -camellia-256-cbc          -camellia-256-cfb         
-camellia-256-cfb1         -camellia-256-cfb8         -camellia-256-ecb         
-camellia-256-ofb          -camellia128               -camellia192              
-camellia256               -cast                      -cast-cbc                 
-cast5-cbc                 -cast5-cfb                 -cast5-ecb                
-cast5-ofb                 -des                       -des-cbc                  
-des-cfb                   -des-cfb1                  -des-cfb8                 
-des-ecb                   -des-ede                   -des-ede-cbc              
-des-ede-cfb               -des-ede-ofb               -des-ede3                 
-des-ede3-cbc              -des-ede3-cfb              -des-ede3-cfb1            
-des-ede3-cfb8             -des-ede3-ofb              -des-ofb                  
-des3                      -desx                      -desx-cbc                 
-id-aes128-GCM             -id-aes192-GCM             -id-aes256-GCM            
-idea                      -idea-cbc                  -idea-cfb                 
-idea-ecb                  -idea-ofb                  -rc2                      
-rc2-40-cbc                -rc2-64-cbc                -rc2-cbc                  
-rc2-cfb                   -rc2-ecb                   -rc2-ofb                  
-rc4                       -rc4-40                    -rc4-hmac-md5             
-seed                      -seed-cbc                  -seed-cfb                 
-seed-ecb                  -seed-ofb                  
[root@backup ~]# 
可以看到上述我们执行的是enc -help命令,enc是什么东西?原来openssl提供了两种方式调用对称加密算法:

一种就是直接调用对称加密指令,例如:
openssl des-cbc -in plain.txt -out encrypt.txt -pass pass:12345678

另外一种是使用enc的方式,即用对称加密指令作为enc指令的参数,例如:.
openssl enc -des-cbc -in plain.txt -out encrypt.txt -pass pass:12345678
上述两条指令完成的功能是一样的,而且其参数也是一样。原来enc是作用是什么呢?简单来说,为了省事……。

openssl提供了N多的对称加密算法指令,enc就是把这些N多的对称的加密算法指令统一集成到enc指令中。
当用户使用时,只需使用enc,指定加密算法,就是完成单独的加密算法指令完成的操作。
而且,enc中可以指定的对称加密算法指令可能并没有以单独指令的形式存在。所有笔者建议使用enc这种方式。
当然,虽然openssl为我们提供的对称加密算法指令虽然功能强大,
但并不完整,例如对称加密算法不支持76位的RC2加解密或者84位的RC4加解密灯功能。
如果想灵活的使用这些加密算法和模式,就需要学习openssl提供的API




2、对称加密算法指令参数
可以通过enc的man手册查看enc的详细用法,也可以通过enc -help的方式查看主要参数概要说明,如下
[root@backup ~]# openssl enc --help
unknown option '--help'
options are
-in <file>     input file
-out <file>    output file
-pass <arg>    pass phrase source
-e             encrypt
-d             decrypt
-a/-base64     base64 encode/decode, depending on encryption flag
-k             passphrase is the next argument
-kfile         passphrase is the first line of the file argument
-md            the next argument is the md to use to create a key
                 from a passphrase. See openssl dgst -h for list.
-S             salt in hex is the next argument
-K/-iv         key/iv in hex is the next argument
-[pP]          print the iv/key (then exit if -P)
-bufsize <n>   buffer size
-nopad         disable standard block padding
-engine e      use engine e, possibly a hardware device.
说明:
-chipername选项:加密算法,Openssl支持的算法在上面已经列出了,你只需选择其中一种算法即可实现文件加密功能。

-in选项:输入文件,对于加密来说,输入的应该是明文文件;对于解密来说,输入的应该是加密的文件。该选项后面直接跟文件名。
-out选项:输出文件,对于加密来说,输出的应该是加密后的文件名;对于解密来说,输出的应该是明文文件名。

-pass选项:选择输入口令的方式,输入源可以是标准输入设备,命令行输入,文件、变量等。

-e选项:实现加密功能(不使用-d选项的话默认是加密选项)。
-d选项:实现解密功能。

-a/-base64由于文件加密后是二进制形式,不方便查看,使用该参数可以使加密后的内容经过base64编码,使其可读;同样,解密时需要先进行base64解编码,然后进行解密操作。

-k/-kfile兼容以前版本,指定密码输入方式,现已被pass参数取代

-md指定密钥生成的摘要算法,用户输入的口令不能直接作为文件加密的密钥,而是经过摘要算法做转换,此参数指定摘要算法,默认md5



-K/-IV默认文件的加密密钥的Key和IV值是有用户输入的密码经过转化生成的,但也可以由用户自己指定Key/IV值,此时pass参数不起作用

-salt选项:是否使用盐值,默认是使用的。

-[pP] 加上p参数会打印文件密钥Key和IV值,加上P参数也会打印文件密钥Key和IV值,但不进行真正的加解密操作

[bufsize]读写文件的I/O缓存,一般不需要指定

[-nopad]不使用补齐,这就需要输入的数据长度是使用加密算法的分组大小的倍数

[engine]指定三方加密设备,没有环境,暂不实验




3、对称加密算法使用示例

1、只对文件进行base64编码,而不使用加解密

/*对文件进行base64编码*/
openssl enc -base64 -in plain.txt -out base64.txt
/*对base64格式文件进行解密操作*/
openssl enc -base64 -d -in base64.txt -out plain2.txt
/*使用diff命令查看可知解码前后明文一样*/
diff plain.txt plain2.txt

2、不同方式的密码输入方式
/*命令行输入,密码123456*/
openssl enc -aes-128-cbc -in plain.txt -out out.txt -pass pass:123456
/*文件输入,密码123456*/
echo 123456 > passwd.txt
openssl enc -aes-128-cbc -in plain.txt -out out.txt -pass file:passwd.txt
/*环境变量输入,密码123456*/
passwd=123456
export passwd
openssl enc -aes-128-cbc -in plain.txt -out out.txt -pass env:passwd
/*从文件描述输入*/ 
openssl enc -aes-128-cbc -in plain.txt -out out.txt -pass fd:1  
/*从标准输入输入*/ 
openssl enc -aes-128-cbc -in plain.txt -out out.txt -pass stdin 


3、固定salt值加密
xlzh@cmos:~$ openssl enc -aes-128-cbc -in plain.txt -out encrypt.txt -pass pass:123456 -P
salt=32F5C360F21FC12D
key=D7E1499A578490DF940D99CAE2E29EB1
iv =78EEB538897CAF045F807A97F3CFF498
xlzh@cmos:~$ openssl enc -aes-128-cbc -in plain.txt -out encrypt.txt -pass pass:123456 -P
salt=DAA482697BECAB46
key=9FF8A41E4AC011FA84032F14B5B88BAE
iv =202E38A43573F752CCD294EB8A0583E7
xlzh@cmos:~$ openssl enc -aes-128-cbc -in plain.txt -out encrypt.txt -pass pass:123456 -P -S 123
salt=1230000000000000
key=50E1723DC328D98F133E321FC2908B78
iv =1528E9AD498FF118AB7ECB3025AD0DC6
xlzh@cmos:~$ openssl enc -aes-128-cbc -in plain.txt -out encrypt.txt -pass pass:123456 -P -S 123
salt=1230000000000000
key=50E1723DC328D98F133E321FC2908B78
iv =1528E9AD498FF118AB7ECB3025AD0DC6
xlzh@cmos:~$ 
可以看到,不使用-S参数,salt参数随机生成,key和iv值也不断变化,当slat值固定时,key和iv值也是固定的。

4、加解密后过程使用base64编解码
/*使用-a参数加密后使用base64编码*/
xlzh@cmos:~$ openssl enc -aes-128-cbc -in plain.txt -a -out encrypt.txt -pass pass:123456
/*使用-a参数解密前使用base64解码*/
xlzh@cmos:~$ openssl enc -aes-128-cbc -in encrypt.txt -d -a -out plain1.txt -pass pass:123456
/*文件一样*/
xlzh@cmos:~$ diff plain.txt plain1.txt 
/*加密后文件使用了base64编码*/
xlzh@cmos:~$ cat encrypt.txt 
U2FsdGVkX19KbCj9GMI1TBOQjP8JJcefIUH1tHwf/Z4=


 5、手动指定Key和IV值
/*手动指定key和iv值,salt固定*/
xlzh@cmos:~$ openssl enc -aes-128-cbc -in plain.txt -out encrypt.txt  -K 1223 -iv f123 -p
salt=0B00000000000000
key=12230000000000000000000000000000
iv =F1230000000000000000000000000000
/*指定pass密码,不起作用,注意Key和IV值是16进制*/
xlzh@cmos:~$ openssl enc -aes-128-cbc -in plain.txt -out encrypt.txt  -K 1223 -iv f123 -p -pass pass:123456
salt=F502F4B8DE62E0E5
key=12230000000000000000000000000000
iv =F1230000000000000000000000000000



6、实例

##所以命令都在Linux中执行##
##查看是否安装了该工具,我的环境自带了,文章不做安装描述##
openssl
##加密(执行后获得加密码)##
echo abc | openssl aes-128-cbc -k 123 -base64
##解密(加密码太长,用*表示了)##
echo ***** | openssl aes-128-cbc -d -k 123 -base64




7、[root@backup ~]# cat /data/public/kdzd/oldcode/gitcode_tar.sh 
#!/bin/bash
log_file="/data/public/kdzd/log.txt"
echo "###################BEGIN###############" >>$log_file
date >>$log_file
exec 1>>$log_file
exec 2>>$log_file
tar -czf - /data/public/kdzd/code_190 | openssl des3 -salt -k /root/mima/pwd -out /data/public/kdzd/code_tar_gz/code_190.tar.gz
tar -czf - /data/public/kdzd/code_200 | openssl des3 -salt -k /root/mima/pwd -out /data/public/kdzd/code_tar_gz/code_200.tar.gz
[root@backup ~]# 


压缩
tar -czvf /path/to/file.tar.gz file
解压
tar -xzvf /path/to/file.tar.gz /path/to

加密压缩
tar -czvf - file | openssl des3 -salt -k password -out /path/to/file.tar.gz
解密解压
openssl des3 -d -k password -salt -in /path/to/file.tar.gz | tar xzf -
Linux命令行下的openssl加密

 

由于前期部署了gerrit代码审核系统,开发调整后的线上代码都放到gerrit上,这就要求我们要保证代码的安全。所以,对gerrit代码的备份至关重要!

备份的策略是:
1)先首次将gerrit项目代码git clone下来,然后后续备份前进行git pull
2)编写备份脚本,crontab定时执行
3)除了本机备份外,还可以备份到远程

下面是操作记录:

比如,备份gerrit上的下列项目代码

 

 

 

查看各个项目的gerrit代码下载地址(ssh方式):

 

1)首先在本地将gerrit项目代码下载下来(本地的root用户下的公钥已经放到gerrit上,在root用户下git clone)
[root@backup ~]# mkdir /data/TCL-KDZD-Gerrit.bak -p
[root@backup ~]# cd /data/TCL-KDZD-Gerrit.bak/
[root@backup TCL-KDZD-Gerrit.bak]# pwd
/data/TCL-KDZD-Gerrit.bak
#编写一个脚本 clone所有Gerrit库代码
[root@backup TCL-KDZD-Gerrit.bak]# vim git-clone.sh

[root@backup TCL-KDZD-Gerrit.bak]# cat git-clone.sh 
#!/bin/bash
printf "*************************************\n"
echo " cat file while read line"
cat project.txt |while read line
do
    echo $line;
git clone ssh://xxx@xxx.xxx.xxx.xxx:29418/$line
&&scp -p -P 29418 xxx@xxx.xxx.xxx.xxx:hooks/commit-msg $line/.git/hooks/;
Done

[root@backup TCL-KDZD-Gerrit.bak]# vim project.txt  #逐行写入项目名
[root@backup TCL-KDZD-Gerrit.bak]# ls
git-clone.sh  project.txt
[root@backup TCL-KDZD-Gerrit.bak]# bash git-clone.sh #执行脚本,至此所有的代码都下载下来了

随便进去一个代码库 查看是否分支都下载下来了
[root@backup TCL-KDZD-Gerrit.bak]# cd 4662/
[root@backup 4662]# git branch -av
* master                0ff8a48 init
  remotes/origin/HEAD   -> origin/master
  remotes/origin/master 0ff8a48 init
[root@backup 4662]# 
//查看发现git分支也已经下载下来了
 
[root@backup TCL-KDZD-Gerrit.bak]# cat git-pull.sh  #编写更新代码脚本
#!/bin/bash
log_file="/data/log/log.txt"
echo "###################BEGIN###############" >>$log_file
date >>$log_file
exec 1>>$log_file
exec 2>>$log_file
cat project.txt |while read line
do
    echo $line >> $log_file;
    cd /data/TCL-KDZD-Gerrit.bak/$line;
    git pull;
done
 
然后crontab计划任务制定,每天晚上备份一次
[root@backup TCL-KDZD-Gerrit.bak]# cat /etc/crontab 
30 22   * * *   root  /data/TCL-KDZD-Gerrit.bak/git-pull.sh
[root@backup TCL-KDZD-Gerrit.bak]# 

 

2)将本地备份加密压缩,加密压缩然后通过rsync 异地服务器
总体方法是:将/data/TCL-KDZD-Gerrit.bak  加密压缩然后通过rsync  推送异地
频率:每周一次
[root@backup TCL-KDZD-Gerrit.bak]# cat git-tar.sh 
#!/bin/bash
log_file="/data/log/tar_log.txt"
echo "###################BEGIN###############" >>$log_file
date >>$log_file
exec 1>>$log_file
exec 2>>$log_file
tar -czf - /data/TCL-KDZD-Gerrit.bak | openssl des3 -salt -k /data/pwd -out /data/public/TCL-KDZD-Gerrit.tar.gz
[root@backup TCL-KDZD-Gerrit.bak]# bash git-tar.sh

解压命令:
openssl des3 -d -k /data/pwd -salt -in /data/public/TCL-KDZD-Gerrit.tar.gz  |  tar xzf -

 

在当前目录下有一个pma目录的文件夹:

1、使用tar对文件压缩加密:
# tar -zcvf - pma|openssl des3 -salt -k password | dd of=pma.des3
完成将得到一个pma.des3的打包文件,用你设置的密码替换password。

2、使用tar对加密文件解压:
# dd if=pma.des3 |openssl des3 -d -k password|tar zxf -
注意:命令最后有”-“,它将释放所有的文件。其中-k password可以不使用,这样执行完命令后会提示你输入密码,加上-k参数表示在程序中自动验证密码。

 

 

eg: rsync上传和下载同步
/usr/bin/rsync -vzrtopg --progress --delete hening@192.168.141.128::backup /home/backup --password-file=/etc/rsync.pas
/usr/bin/rsync -vzrtopg --progress --password-file=/etc/rsync.pas  /home/backup hening@192.168.141.128::backup

 

posted @ 2020-08-04 14:58  冥想心灵  阅读(384)  评论(0编辑  收藏  举报