Dec
5
[译]OpenSSL Command-Line HOWTO
十、Password hashes
使用passwd选项,你可以得到一个类似/etc/passwd或者/etc/shadow格式的密码。
1、创建一个crypt-style密码
引用
$ openssl passwd MySecret
8E4vqBR4UOYF
8E4vqBR4UOYF
如果知道已经存在密码的“salt”,可以复制其hash:
引用
$ openssl passwd -salt 8E MySecret
8E4vqBR4UOYF.
8E4vqBR4UOYF.
否则,即使相同的密码,因每次的hash不同,结果也不同的。
2、创建一个shadow-style的密码
新的Unix系统(包括linux),都使用安全的MD5-based来作为salt,可以这样产生类似的密码:
引用
$ openssl passwd -1 MySecret
$1$HkrAilcM$Jy3vYQc8UiEXfTLRrlSpD.
$1$HkrAilcM$Jy3vYQc8UiEXfTLRrlSpD.
而slat在二到三$符号之间,所以有:
引用
$ openssl passwd -1 -salt HkrAilcM MySecret
$1$HkrAilcM$Jy3vYQc8UiEXfTLRrlSpD.
$1$HkrAilcM$Jy3vYQc8UiEXfTLRrlSpD.
十一、Prime numbers(素数)
从0.9.7e之后,prime选项被加入到openssl库中。
1、如何判断一个数字是否prime
使用prime选项即可。需要注意的是,返回的结果是十六进制,而非十进制形式的。
引用
$ openssl prime 119054759245460753
1A6F7AC39A53511 is not prime
$ openssl prime -hex 2f
2F is prime
1A6F7AC39A53511 is not prime
$ openssl prime -hex 2f
2F is prime
2、如何创建一组prime numbers
引用
# define start and ending points
AQUO=10000
ADQUEM=10100
for N in $(seq $AQUO $ADQUEM); do
# use bc to convert hex to decimal
openssl prime $N | awk '/is prime/ {print "ibase=16;"$1}' | bc
done
AQUO=10000
ADQUEM=10100
for N in $(seq $AQUO $ADQUEM); do
# use bc to convert hex to decimal
openssl prime $N | awk '/is prime/ {print "ibase=16;"$1}' | bc
done
十二、随机数
使用rand选项可以得到二进制或base64编码后的随机数:
引用
# write 128 random bytes of base64-encoded data to stdout
openssl rand -base64 128
# write 1024 bytes of binary random data to a file
openssl rand -out random-data.bin 1024
# seed openssl with semi-random bytes from browser cache
cd $(find ~/.mozilla/firefox -type d -name Cache)
openssl rand -rand $(find . -type f -printf '%f:') -base64 1024
openssl rand -base64 128
# write 1024 bytes of binary random data to a file
openssl rand -out random-data.bin 1024
# seed openssl with semi-random bytes from browser cache
cd $(find ~/.mozilla/firefox -type d -name Cache)
openssl rand -rand $(find . -type f -printf '%f:') -base64 1024
从/dev/urandom可以得到类似的种子:
引用
# get 32 bytes from /dev/urandom and base64 encode them
head -c 32 /dev/urandom | openssl enc -base64
head -c 32 /dev/urandom | openssl enc -base64
十三、S/MIME
S/MIME是发送和接收安全MIME的一个标准,常用于email中。通过OpenSSL的smime选项,可以提供命令行的S/MIME服务。
1、如何校验一个已经签名的S/MIME信息
把收到的信息保存到msg.txt文件即可:
openssl smime -verify -in msg.txt
如果发送人的证书被OpenSSL接受的,可以得到:
引用
Verification successful.
而如果内容被非认证架构修改,会得到错误信息:
引用
Verification failure
23016:error:21071065:PKCS7 routines:PKCS7_signatureVerify:digest
failure:pk7_doit.c:804:
23016:error:21075069:PKCS7 routines:PKCS7_verify:signature
failure:pk7_smime.c:265:
23016:error:21071065:PKCS7 routines:PKCS7_signatureVerify:digest
failure:pk7_doit.c:804:
23016:error:21075069:PKCS7 routines:PKCS7_verify:signature
failure:pk7_smime.c:265:
而如果发送人的证书不在OpenSSL的识别范围内,也会出错:
引用
Verification failure
9544:error:21075075:PKCS7 routines:PKCS7_verify:certificate verify
error:pk7_smime.c:222:Verify error:self signed certificate
9544:error:21075075:PKCS7 routines:PKCS7_verify:certificate verify
error:pk7_smime.c:222:Verify error:self signed certificate
openssl smime -pk7out -in msg.txt | \
openssl pkcs7 -text -noout -print_certs
openssl pkcs7 -text -noout -print_certs
通过下面的命令,得到证书的copy
openssl smime -pk7out -in msg.txt -out her-cert.pem
这样,你就可以再次利用它来验证
openssl smime -verify -in msg.txt -CAfile /path/to/her-cert.pem
2、如何加密一个S/MIME信息
假设某人把她的公共证书发给你,并且要求你加密这些信息才给它。你应保存她的her-cert.pem文件。然后再reply。
为获得the default—though fairly weak—RC2-40 encryption,你应该告诉openssl信息和证书的位置
openssl smime her-cert.pem -encrypt -in my-message.txt
如果你确认对方有robust SSL toolkit,你可以指定一个类似DES的运算法则来加密
openssl smime her-cert.pem -encrypt -des3 -in my-message.txt
当使用sendmail时,可以一并来实现
openssl smime her-cert.pem \
-encrypt \
-des3 \
-in my-message.txt \
-from 'Your Fullname <you@youraddress.com>' \
-to 'Her Fullname <her@heraddress.com>' \
-subject 'My encrypted reply' |\
sendmail her@heraddress.com
-encrypt \
-des3 \
-in my-message.txt \
-from 'Your Fullname <you@youraddress.com>' \
-to 'Her Fullname <her@heraddress.com>' \
-subject 'My encrypted reply' |\
sendmail her@heraddress.com
3、如何对S/MIME信息签名
如果你不想加密,而只是想签名,可以这样:
openssl smime \
-sign \
-signer /path/to/your-cert.pem \
-in my-message.txt \
-from 'Your Fullname <you@youraddress.com>' \
-to 'Her Fullname <her@heraddress.com>' \
-subject 'My signed reply' |\
sendmail her@heraddress.com
-sign \
-signer /path/to/your-cert.pem \
-in my-message.txt \
-from 'Your Fullname <you@youraddress.com>' \
-to 'Her Fullname <her@heraddress.com>' \
-subject 'My signed reply' |\
sendmail her@heraddress.com
唯一的区别,就是使用你自己的密钥和证书,而非发送者的证书咯。
原文备份:

十四、参考资料
http://www.madboa.com/geek/openssl/
http://blog.csdn.net/wuhuiran/archive/2007/09/13/1783436.aspx