景灵

——我要我想要的


  • 首页

  • 分类

  • 归档

  • 标签

  • 关于

openssl学习

发表于 Aug 18 2016   |   分类于 加密

来源:http://linux.51yip.com/search/openssl

OpenSSL整个软件包大概可以分成三个主要的功能部分:

  • 密码算法库
  • SSL协议库
  • 应用程序

对称加密算法

  OpenSSL一共提供了8种对称加密算法,其中7种是分组加密算法,仅有的一种流加密算法是RC4。这7种分组加密算法分别是AES、DES、Blowfish、CAST、IDEA、RC2、RC5,都支持电子密码本模式(ECB)、加密分组链接模式(CBC)、加密反馈模式(CFB)和输出反馈模式(OFB)四种常用的分组密码加密模式。其中,AES使用的加密反馈模式(CFB)和输出反馈模式(OFB)分组长度是128位,其它算法使用的则是64位。事实上,DES算法里面不仅仅是常用的DES算法,还支持三个密钥和两个密钥3DES算法。

对称加密应用例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 对称加密应用例子
# 用DES3算法的CBC模式加密文件plaintext.doc,
# 加密结果输出到文件ciphertext.bin
# openssl enc -des3 -salt -in plaintext.doc -out ciphertext.bin
# 用DES3算法的OFB模式解密文件ciphertext.bin,
# 提供的口令为trousers,输出到文件plaintext.doc
# 注意:因为模式不同,该命令不能对以上的文件进行解密
# openssl enc -des-ede3-ofb -d -in ciphertext.bin -out plaintext.doc -pass pass:trousers
# 用Blowfish的CFB模式加密plaintext.doc,口令从环境变量PASSWORD中取
# 输出到文件ciphertext.bin
# openssl bf-cfb -salt -in plaintext.doc -out ciphertext.bin -pass env:PASSWORD
# 给文件ciphertext.bin用base64编码,输出到文件base64.txt
# openssl base64 -in ciphertext.bin -out base64.txt
# 用RC5算法的CBC模式加密文件plaintext.doc
# 输出到文件ciphertext.bin,
# salt、key和初始化向量(iv)在命令行指定
# openssl rc5 -in plaintext.doc -out ciphertext.bin -S C62CB1D49F158ADC -iv E9EDACA1BD7090C6 -K 89D4B1678D604FAA3DBFFD030A314B29

非对称加密算法

  OpenSSL一共实现了4种非对称加密算法,包括DH算法、RSA算法、DSA算法和椭圆曲线算法(EC)。DH算法一般用户密钥交换。RSA算法既可以用于密钥交换,也可以用于数字签名,当然,如果你能够忍受其缓慢的速度,那么也可以用于数据加密。DSA算法则一般只用于数字签名。

信息摘要算法

  OpenSSL实现了5种信息摘要算法,分别是MD2、MD5、MDC2、SHA(SHA1)和RIPEMD。SHA算法事实上包括了SHA和SHA1两种信息摘要算法,此外,OpenSSL还实现了DSS标准中规定的两种信息摘要算法DSS和DSS1。

消息摘要算法应用例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 用SHA1算法计算文件file.txt的哈西值,输出到stdout
# openssl dgst -sha1 file.txt
#用SHA1算法计算文件file.txt的哈西值,输出到文件digest.txt
# openssl sha1 -out digest.txt file.txt
# 用DSS1(SHA1)算法为文件file.txt签名,输出到文件dsasign.bin
# 签名的private key必须为DSA算法产生的,保存在文件dsakey.pem中
# openssl dgst -dss1 -sign dsakey.pem -out dsasign.bin file.txt
# 用dss1算法验证file.txt的数字签名dsasign.bin,
# 验证的private key为DSA算法产生的文件dsakey.pem
# openssl dgst -dss1 -prverify dsakey.pem -signature dsasign.bin file.txt
# 用sha1算法为文件file.txt签名,输出到文件rsasign.bin
# 签名的private key为RSA算法产生的文件rsaprivate.pem
# openssl sha1 -sign rsaprivate.pem -out rsasign.bin file.txt
# 用sha1算法验证file.txt的数字签名rsasign.bin,
# 验证的public key为RSA算法生成的rsapublic.pem
# openssl sha1 -verify rsapublic.pem -signature rsasign.bin file.txt

密钥和证书管理

  密钥和证书管理是PKI的一个重要组成部分,OpenSSL为之提供了丰富的功能,支持多种标准。

  首先,OpenSSL实现了ASN.1的证书和密钥相关标准,提供了对证书、公钥、私钥、证书请求以及CRL等数据对象的DER、PEM和BASE64的编解码功能。OpenSSL提供了产生各种公开密钥对和对称密钥的方法、函数和应用程序,同时提供了对公钥和私钥的DER编解码功能。并实现了私钥的PKCS#12和PKCS#8的编解码功能。OpenSSL在标准中提供了对私钥的加密保护功能,使得密钥可以安全地进行存储和分发。

  在此基础上,OpenSSL实现了对证书的X.509标准编解码、PKCS#12格式的编解码以及PKCS#7的编解码功能。并提供了一种文本数据库,支持证书的管理功能,包括证书密钥产生、请求产生、证书签发、吊销和验证等功能。

  事实上,OpenSSL提供的CA应用程序就是一个小型的证书管理中心(CA),实现了证书签发的整个流程和证书管理的大部分机制。

其他例子

Diffie-Hellman应用例子:

1
2
3
4
5
6
7
# 使用生成因子2和随机的1024-bit的素数产生D0ffie-Hellman参数
# 输出保存到文件dhparam.pem
# openssl dhparam -out dhparam.pem -2 1024
# 从dhparam.pem中读取Diffie-Hell参数,以C代码的形式
# 输出到stdout
# openssl dhparam -in dhparam.pem -noout -C

DSA应用例子应用例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 生成1024位DSA参数集,并输出到文件dsaparam.pem
# openssl dsaparam -out dsaparam.pem 1024
# 使用参数文件dsaparam.pem生成DSA私钥匙,
# 采用3DES加密后输出到文件dsaprivatekey.pem
# openssl gendsa -out dsaprivatekey.pem -des3 dsaparam.pem
# 使用私钥匙dsaprivatekey.pem生成公钥匙,
# 输出到dsapublickey.pem
# openssl dsa -in dsaprivatekey.pem -pubout -out dsapublickey.pem
# 从dsaprivatekey.pem中读取私钥匙,解密并输入新口令进行加密,
# 然后写回文件dsaprivatekey.pem
# openssl dsa -in dsaprivatekey.pem -out dsaprivatekey.pem -des3 -passin

RSA应用例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# 产生1024位RSA私匙,用3DES加密它,口令为trousers,
# 输出到文件rsaprivatekey.pem
# openssl genrsa -out rsaprivatekey.pem -passout pass:trousers -des3 1024
# 从文件rsaprivatekey.pem读取私匙,用口令trousers解密,
# 生成的公钥匙输出到文件rsapublickey.pem
# openssl rsa -in rsaprivatekey.pem -passin pass:trousers -pubout -out rsapubckey.pem
# 用公钥匙rsapublickey.pem加密文件plain.txt,
# 输出到文件cipher.txt
# openssl rsautl -encrypt -pubin -inkey rsapublickey.pem -in plain.txt -out cipher.txt
# 使用私钥匙rsaprivatekey.pem解密密文cipher.txt,
# 输出到文件plain.txt
# openssl rsautl -decrypt -inkey rsaprivatekey.pem -in cipher.txt -out plain.txt
# 用私钥匙rsaprivatekey.pem给文件plain.txt签名,
# 输出到文件signature.bin
# openssl rsautl -sign -inkey rsaprivatekey.pem -in plain.txt -out signature.bin
# 用公钥匙rsapublickey.pem验证签名signature.bin,
# 输出到文件plain.txt
# openssl rsautl -verify -pubin -inkey rsapublickey.pem -in signature.bin -out plain
# 从X.509证书文件cert.pem中获取公钥匙,
# 用3DES加密mail.txt
# 输出到文件mail.enc
# openssl smime -encrypt -in mail.txt -des3 -out mail.enc cert.pem
# 从X.509证书文件cert.pem中获取接收人的公钥匙,
# 用私钥匙key.pem解密S/MIME消息mail.enc,
# 结果输出到文件mail.txt
# openssl smime -decrypt -in mail.enc -recip cert.pem -inkey key.pem -out mail.txt
# cert.pem为X.509证书文件,用私匙key,pem为mail.txt签名,
# 证书被包含在S/MIME消息中,输出到文件mail.sgn
# openssl smime -sign -in mail.txt -signer cert.pem -inkey key.pem -out mail.sgn
# 验证S/MIME消息mail.sgn,输出到文件mail.txt
# 签名者的证书应该作为S/MIME消息的一部分包含在mail.sgn中
# openssl smime -verify -in mail.sgn -out mail.txt

https证书生成

发表于 Aug 17 2016   |   分类于 https
1
2
3
4
#openssl genrsa -des3 -out server.key 1024
#openssl req -new -key server.key -out server.csr
#openssl rsa -in server.key -out server_nopwd.key
#openssl x509 -req -days 365 -in server.csr -signkey server_nopwd.key -out server.crt

nginx更改配置:

1
2
3
4
5
6
server {
listen 443;
ssl on;
ssl_certificate /usr/local/nginx/conf/server.crt;
ssl_certificate_key /usr/local/nginx/conf/server_nopwd.key;
}

重启nginx即可生效。

mysql精确时间到毫秒

发表于 Aug 16 2016   |   分类于 mysql , time

  在项目中要按时间排序分页,但是由于时间的精度不够(默认精确到秒s),导致排序分页时数据重复或者缺失。

  这个问题在5.6.4以前的版本mysql中常用的解决办法就是用两个字段存储时间;

  不过mysql在5.6.4版本之后支持了精度设置,支持定义time(n)、datetime(n)或者timestamp(n)这样的字段,然后使用 current_timestamp(n) 即可以为该字段赋值带有毫秒或微秒值的时间数据了!

Unicode(转)

发表于 Aug 10 2016

来源:http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html

ASCII码

  我们知道,在计算机内部,所有的信息最终都表示为一个二进制的字符串。每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出256种状态,这被称为一个字节(byte)。也就是说,一个字节一共可以用来表示256种不同的状态,每一个状态对应一个符号,就是256个符号,从0000000到11111111。

阅读全文 »

node.js web项目gzip压缩

发表于 Aug 4 2016   |   分类于 node.js , 压缩 , 优化

通常我们的node.js web项目都是通过express框架搭建的。
在express 4.x版本中引入外部中间件compression,然后在其他中间件前面使用此中间件即可(放在其他中间件前面以保证所有的返回都是被压缩的)。

1
2
3
4
5
6
7
8
var compression = require('compression')
var express = require('express')
var app = express()
// compress all requests
app.use(compression())
// add all routes

compression([options])
  • chunkSize: 用来设置使用压缩的最小size,默认是16384,单位是byte,也可以使用'10kb'来显示的指定单位。

      假设compression({chunkSize: '1kb'}),那么当响应大于1kb的时候,服务器会压缩响应数据,并为响应header添加Content-Encoding:gzip,Transfer-Encoding:chunked,响应小于的时候不会压缩,也不会添加header。

这个中间件还有很多其他的可配置条件,可以参考其文档

nginx--gzip

发表于 Aug 4 2016   |   分类于 nginx , 压缩 , 优化

开启网站的gzip压缩功能,可以大大减少网络传输流量,同时提高传输效率,提升用户体验(注:需要浏览器支持)。

  nginx本身提供了这样的配置功能,只需做简单的配置即可使用。

打开nginx的配置文件nginx.conf,一般在/etc/nginx下

1
sudo vim /etc/nginx/nginx.conf

添加如下的配置项:

1
2
3
4
5
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_comp_level 5;
gzip_types text/plain application/x-javascript text/css application/xml text/javascript application/x-httpd-php;

阅读全文 »

xml学习

发表于 Aug 4 2016   |   分类于 xml , 整理

什么是 XML?

  • XML 指可扩展标记语言(EXtensible Markup Language)
  • XML 是一种标记语言,很类似 HTML
  • XML 的设计宗旨是传输和存储数据,而非显示数据
  • XML 标签没有被预定义。您需要自行定义标签。
  • XML 被设计为具有自我描述性。

example:

1
2
3
4
5
6
7
<?xml version="1.0" encoding="ISO-8859-1"?>
<note>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>

阅读全文 »

Node.js调试相关资料

发表于 Aug 3 2016   |   分类于 Node.js , 整理
  1. nodemon

    • https://github.com/remy/nodemon
  2. node-inspector

    • 源码
      • https://github.com/node-inspector/node-inspector
    • 安装使用说明
      • http://blog.chinaunix.net/uid-52437-id-3451654.html

有用的linux命令

发表于 Aug 3 2016
  1. 问题:/usr/local/bin is not writable? & /usr/local/share is not writable?(安装软件的时候)

    sudo chown -R jinglinger /usr/local/bin
    

python工具

发表于 Aug 3 2016   |   分类于 python , 整理
1
2
pip: 可以很方便的安装、卸载和管理Python的包.
virtualenv: 则可以建立多个独立的虚拟环境,各个环境中拥有自己的python解释器和各自的package包,互不影响。
1. pip

安装pip:https://pip.pypa.io/en/stable/installing/

当我按照官方文档安装完成之后,却依旧不能使用pip,find一下pip,在python27下确实找到了它。

阅读全文 »
12…8
crazyjingling

crazyjingling

crazyjingling's blog | Node.js | javascript

75 日志
60 分类
106 标签
github twitter weibo zhihu
© 2016 crazyjingling
由 Hexo 强力驱动
主题 - NexT.Mist