跳过导航链接 | |
退出打印视图 | |
系统管理指南:安全性服务 Oracle Solaris 10 8/11 Information Library (简体中文) |
本节介绍如何生成对称密钥、如何创建校验和来检验文件完整性以及如何避免文件遭到窃听。本节中的命令可由一般用户运行。开发者可以编写使用这些命令的脚本。
加密文件以及生成文件的 MAC 时需要使用密钥。密钥应来源于随机数池。
如果您的站点上有随机数生成器,请使用此生成器。否则,可以使用以 Oracle Solaris /dev/urandom 设备作为输入的 dd 命令。有关更多信息,请参见 dd(1M) 手册页。
% encrypt -l Algorithm Keysize: Min Max (bits) ------------------------------------------ aes 128 128 arcfour 8 128 des 64 64 3des 192 192 % mac -l Algorithm Keysize: Min Max (bits) ------------------------------------------ des_mac 64 64 sha1_hmac 8 512 md5_hmac 8 512 sha256_hmac 8 512 sha384_hmac 8 1024 sha512_hmac 8 1024
将最小最大密钥和最大密钥大小除以 8。最小密钥大小和最大密钥大小不同时,可以使用中间密钥大小。例如,可以将值 8、16 或 64 传递到 sha1_hmac 和 md5_hmac 函数的 dd 命令。
% dd if=/dev/urandom of=keyfile bs=n count=n
输入文件。要生成随机密钥,请使用 /dev/urandom 文件。
保存所生成密钥的输出文件。
密钥大小(以字节为单位)。要获取字节长度,请将密钥的位长度除以 8。
输入块的计数。n 的值应为 1。
密钥文件不应由除用户之外的任何人读取。
% chmod 400 keyfile
示例 14-1 创建用于 AES 算法的密钥
在下面的示例中,将创建一个用于 AES 算法的密钥。该密钥还将进行存储以供日后解密之用。AES 机制使用 128 位密钥。该密钥在 dd 命令中表示为 16 字节。
% ls -al ~/keyf drwx------ 2 jdoe staff 512 May 3 11:32 ./ % dd if=/dev/urandom of=$HOME/keyf/05.07.aes16 bs=16 count=1 % chmod 400 ~/keyf/05.07.aes16
示例 14-2 创建用于 DES 算法的密钥
在下面的示例中,将创建一个用于 DES 算法的密钥。该密钥还将进行存储以供日后解密之用。DES 机制使用 64 位密钥。该密钥在 dd 命令中表示为 8 字节。
% dd if=/dev/urandom of=$HOME/keyf/05.07.des8 bs=8 count=1 % chmod 400 ~/keyf/05.07.des8
示例 14-3 创建用于 3DES 算法的密钥
在下面的示例中,将创建一个用于 3DES 算法的密钥。该密钥还将进行存储以供日后解密之用。3DES 机制使用 192 位密钥。该密钥在 dd 命令中表示为 24 字节。
% dd if=/dev/urandom of=$HOME/keyf/05.07.3des.24 bs=24 count=1 % chmod 400 ~/keyf/05.07.3des.24
示例 14-4 创建用于 MD5 算法的密钥
在下面的示例中,将创建一个用于 MD5 算法的密钥。该密钥还将进行存储以供日后解密之用。该密钥在 dd 命令中表示为 64 字节。
% dd if=/dev/urandom of=$HOME/keyf/05.07.mack64 bs=64 count=1 % chmod 400 ~/keyf/05.07.mack64
某些应用程序要求使用对称密钥对通信进行加密和解密。在此过程中,应创建一个对称密钥并存储它。
如果您的站点有随机数生成器,可使用此生成器为该密钥创建随机数。此过程不使用您站点的随机数生成器。
您可以使用以 Oracle Solaris /dev/urandom 设备作为输入的 dd 命令。dd 命令不会存储密钥。有关此过程,请参见如何使用 dd 命令生成对称密钥。
使用以下方法之一。
以文件存储的密钥的优点是,您可以从该文件提取密钥以用于应用程序的密钥文件中,如 /etc/inet/secret/ipseckeys 文件或 IPsec。
% pktool genkey keystore=file outkey=key-fn \ [keytype=specific-symmetric-algorithm] [keylen=size-in-bits] \ [dir=directory] [print=n]
值 file 指定密钥存储位置的文件类型。
keystore=file 时的文件名。
对于特定算法,指定 aes、arcfour、des 或 3des。
密钥的长度(以位为单位)。该数字必须可以被 8 整除。请勿对 des 或 3des 指定此值。
key-fn 所在的目录路径。缺省情况下,directory 是当前目录。
将密钥显示至终端窗口。缺省情况下,print 的值为 n。
PKCS #11 密钥库的优点是,您可以按密钥标签检索密钥。此方法适用于加密和解密文件所用的密钥。在使用此方法之前,必须先完成步骤 1。
% pktool genkey label=key-label \ [keytype=specific-symmetric-algorithm] [keylen=size-in-bits] \ [token=token] [sensitive=n] [extractable=y] [print=n]
密钥的用户指定标签。可以从密钥库中按密钥标签检索密钥。
对于特定算法,指定 aes、arcfour、des 或 3des。
密钥的长度(以位为单位)。该数字必须可以被 8 整除。请勿对 des 或 3des 指定此值。
令牌名称。缺省情况下,令牌是 Sun Software PKCS#11 softtoken。
指定密钥的敏感度。当此值为 y 时,不可使用 print=y 参数显示密钥。缺省情况下,sensitive 的值为 n。
指定可从密钥库提取密钥。指定 n 可阻止提取密钥。
将密钥显示至终端窗口。缺省情况下,print 的值为 n。
在使用此方法之前,必须先完成步骤 1。
% pktool keystore=nss genkey label=key-label \ [keytype=[keytype=specific-symmetric-algorithm] [keylen=size-in-bits] [token=token] \ [dir=directory-path] [prefix=database-prefix]
值 nss 指定密钥存储位置的 NSS 类型。
密钥的用户指定标签。可以从密钥库中按密钥标签检索密钥。
对于特定算法,指定 aes、arcfour、des 或 3des。
密钥的长度(以位为单位)。该数字必须可以被 8 整除。请勿对 des 或 3des 指定此值。
令牌名称。缺省情况下,该令牌为 NSS 内部令牌。
NSS 数据库所在的目录路径。缺省情况下,directory 是当前目录。
NSS 数据库的前缀。缺省为无前缀。
将密钥显示至终端窗口。缺省情况下,print 的值为 n。
根据密钥的存储位置,使用以下命令之一。
% pktool list keystore=file objtype=key infile=key-fn Found n keys. Key #1 - keytype:location (keylen)
$ pktool list objtype=key Enter PIN for keystore: Found n keys. Key #1 - keytype:location (keylen)
示例 14-5 使用 pktool 命令创建 DES 密钥
在下面的示例中,将创建一个用于 DES 算法的密钥。该密钥存储在本地文件中以供日后解密之用。该命令使用 400 权限保护文件。创建了密钥后,print=y 选项将在终端窗口显示生成的密钥。
DES 机制使用 64 位密钥。拥有密钥文件的用户将使用 od 命令检索密钥。
% pktool genkey keystore=file outkey=64bit.file1 keytype=des print=y Key Value ="a3237b2c0a8ff9b3" % od -x 64bit.file1 0000000 a323 7b2c 0a8f f9b3
计算文件摘要时,可以通过比较摘要输出来检查文件是否被篡改。摘要不会修改原始文件。
% digest -l md5 sha1 sha256 sha384 sha512
为 digest 命令提供一种算法。
% digest -v -a algorithm input-file > digest-listing
显示以下格式的输出:
algorithm (input-file) = digest
用于计算文件摘要的算法。键入步骤 1 的输出中显示的算法。
digest 命令的输入文件。
digest 命令的输出文件。
示例 14-6 使用 MD5 机制计算摘要
在下面的示例中,digest 命令使用 MD5 机制计算电子邮件附件的摘要。
% digest -v -a md5 email.attach >> $HOME/digest.emails.05.07 % cat ~/digest.emails.05.07 md5 (email.attach) = 85c0a53d1a5cc71ea34d9ee7b1b28b01
未使用 -v 选项时,摘要保存时不会包含随附信息:
% digest -a md5 email.attach >> $HOME/digest.emails.05.07 % cat ~/digest.emails.05.07 85c0a53d1a5cc71ea34d9ee7b1b28b01
示例 14-7 使用 SHA1 机制计算摘要
在下面的示例中,digest 命令使用 SHA1 机制提供目录列表。结果存放于文件中。
% digest -v -a sha1 docs/* > $HOME/digest.docs.legal.05.07 % more ~/digest.docs.legal.05.07 sha1 (docs/legal1) = 1df50e8ad219e34f0b911e097b7b588e31f9b435 sha1 (docs/legal2) = 68efa5a636291bde8f33e046eb33508c94842c38 sha1 (docs/legal3) = 085d991238d61bd0cfa2946c183be8e32cccf6c9 sha1 (docs/legal4) = f3085eae7e2c8d008816564fdf28027d10e1d983
消息验证代码 (message authentication code, MAC) 可计算文件的摘要并使用密钥进一步保护该摘要。MAC 不会修改原始文件。
% mac -l Algorithm Keysize: Min Max ----------------------------------- des_mac 64 64 sha1_hmac 8 512 md5_hmac 8 512 sha256_hmac 8 512 sha384_hmac 8 1024 sha512_hmac 8 1024
您有两种选择。可以提供生成密钥时所基于的 passphrase(口令短语)。或者,可以直接提供密钥。
如果提供密钥,则其大小必须是适用于相应机制的正确大小。有关此过程,请参见如何使用 dd 命令生成对称密钥。
为 mac 命令提供密钥并使用对称密钥算法。
% mac -v -a algorithm [ -k keyfile ] input-file
显示以下格式的输出:
algorithm (input-file) = mac
用于计算 MAC 的算法。键入 mac -l 命令的输出中显示的算法。
包含算法所指定长度的密钥的文件。
MAC 的输入文件。
示例 14-8 使用 DES_MAC 和口令短语计算 MAC
在下面的示例中,将使用 DES_MAC 机制和基于口令短语的密钥对电子邮件附件进行验证。MAC 列表将保存到文件中。如果口令短语存储在某个文件中,则除了该用户之外,其他任何人都不能读取该文件。
% mac -v -a des_mac email.attach Enter passphrase: <Type passphrase> des_mac (email.attach) = dd27870a % echo "des_mac (email.attach) = dd27870a" >> ~/desmac.daily.05.07
示例 14-9 使用 MD5_HMAC 和密钥文件计算 MAC
在下面的示例中,将使用 MD5_HMAC 机制和密钥对电子邮件附件进行验证。MAC 列表将保存到文件中。
% mac -v -a md5_hmac -k $HOME/keyf/05.07.mack64 email.attach md5_hmac (email.attach) = 02df6eb6c123ff25d78877eb1d55710c % echo "md5_hmac (email.attach) = 02df6eb6c123ff25d78877eb1d55710c" \ >> ~/mac.daily.05.07
示例 14-10 使用 SHA1_HMAC 和密钥文件计算 MAC
在下面的示例中,将使用 SHA1_HMAC 机制和密钥对目录清单进行验证。结果存放于文件中。
% mac -v -a sha1_hmac \ -k $HOME/keyf/05.07.mack64 docs/* > $HOME/mac.docs.legal.05.07 % more ~/mac.docs.legal.05.07 sha1_hmac (docs/legal1) = 9b31536d3b3c0c6b25d653418db8e765e17fe07a sha1_hmac (docs/legal2) = 865af61a3002f8a457462a428cdb1a88c1b51ff5 sha1_hmac (docs/legal3) = 076c944cb2528536c9aebd3b9fbe367e07b61dc7 sha1_hmac (docs/legal4) = 7aede27602ef6e4454748cbd3821e0152e45beb4
加密文件时,不会删除或更改原始文件。输出文件将被加密。
有关 encrypt 命令的常见错误的解决方案,请参见示例后面的小节。
您有两种选择。可以提供生成密钥时所基于的 passphrase(口令短语)。或者,可以直接提供密钥。
如果提供口令短语,则必须存储或记住该口令短语。如果您联机存储口令短语,则只有您才可以读取该口令短语文件。
如果提供密钥,则其大小必须是适用于相应机制的正确大小。有关此过程,请参见如何使用 dd 命令生成对称密钥。
提供密钥并使用 encrypt 命令及对称密钥算法参数。
% encrypt -a algorithm [ -k keyfile ] -i input-file -o output-file
用于加密文件的算法。键入 encrypt -l 命令输出中显示的算法。
包含算法所指定长度的密钥的文件。每种算法的密钥长度(以位为单位)在 encrypt -l 命令的输出中列出。
要加密的输入文件。该命令不会更改此文件。
输出文件,是加密形式的输入文件。
示例 14-11 使用 AES 和口令短语进行加密和解密
在下面的示例中,将使用 AES 算法来加密文件。密钥基于口令短语生成。如果口令短语存储在某个文件中,则除了该用户之外,其他任何人都不能读取该文件。
% encrypt -a aes -i ticket.to.ride -o ~/enc/e.ticket.to.ride Enter passphrase: <Type passphrase> Re-enter passphrase: Type passphrase again
输入文件 ticket.to.ride 仍然以其原始形式存在。
要解密输出文件,用户应使用加密该文件的相同口令短语和加密机制。
% decrypt -a aes -i ~/enc/e.ticket.to.ride -o ~/d.ticket.to.ride Enter passphrase: <Type passphrase>
示例 14-12 使用 AES 和密钥文件进行加密和解密
在下面的示例中,将使用 AES 算法来加密文件。AES 机制使用 128 位(即 16 字节)密钥。
% encrypt -a aes -k ~/keyf/05.07.aes16 \ -i ticket.to.ride -o ~/enc/e.ticket.to.ride
输入文件 ticket.to.ride 仍然以其原始形式存在。
要解密输出文件,用户应使用加密文件时所用的密钥和加密机制。
% decrypt -a aes -k ~/keyf/05.07.aes16 \ -i ~/enc/e.ticket.to.ride -o ~/d.ticket.to.ride
示例 14-13 使用 ARCFOUR 和密钥文件进行加密和解密
在下面的示例中,将使用 ARCFOUR 算法来加密文件。ARCFOUR 算法接受 8 位(1 字节)、64 位(8 字节)或 128 位(16 字节)的密钥。
% encrypt -a arcfour -i personal.txt \ -k ~/keyf/05.07.rc4.8 -o ~/enc/e.personal.txt
要解密输出文件,用户应使用加密文件时所用的密钥和加密机制。
% decrypt -a arcfour -i ~/enc/e.personal.txt \ -k ~/keyf/05.07.rc4.8 -o ~/personal.txt
示例 14-14 使用 3DES 和密钥文件进行加密和解密
在下面的示例中,将使用 3DES 算法来加密文件。3DES 算法要求 192 位(24 字节)的密钥。
% encrypt -a 3des -k ~/keyf/05.07.des24 \ -i ~/personal2.txt -o ~/enc/e.personal2.txt
要解密输出文件,用户应使用加密文件时所用的密钥和加密机制。
% decrypt -a 3des -k ~/keyf/05.07.des24 \ -i ~/enc/e.personal2.txt -o ~/personal2.txt
故障排除
以下消息表明,所使用的算法不接受您提供给 encrypt 命令的密钥。
encrypt: unable to create key for crypto operation: CKR_ATTRIBUTE_VALUE_INVALID
encrypt: failed to initialize crypto operation: CKR_KEY_SIZE_RANGE
如果传递的密钥不满足算法的要求,您必须提供正确的密钥。
一种选择是使用口令短语。然后,框架提供满足要求的密钥。
第二种选择是传递算法接受的密钥大小。例如,DES 算法要求 64 位的密钥。3DES 算法要求 192 位的密钥。