系统管理指南:安全性服务

使用 Solaris 加密框架保护文件

本节介绍如何生成对称密钥、如何创建文件完整性校验和以及如何避免文件遭到窃听。本节中的命令可以由普通用户运行。开发者可以编写使用这些命令的脚本。

Procedure如何生成对称密钥

加密文件以及生成文件的 MAC 需要使用密钥。密钥应派生于随机数池。

如果您的站点具有随机数生成器,请使用该生成器。或者,可以使用以 Solaris /dev/urandom 设备作为输入的 dd 命令。有关更多信息,请参见 dd(1M) 手册页。

  1. 确定算法要求的密钥长度。

    1. 列出可用算法。


      % 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
    2. 确定要传递到 dd 命令的密钥长度(以字节为单位)。

      将最小密钥大小和最大密钥大小除以 8。最小密钥大小和最大密钥大小不同时,可以使用中间密钥大小。例如,可以将值 8、16 或 64 传递到 sha1_hmacmd5_hmac 函数的 dd 命令。

  2. 生成对称密钥。


    % dd if=/dev/urandom of=keyfile bs=n count=n
    
    if=file

    输入文件。对于随机密钥,请使用 /dev/urandom 文件。

    of=keyfile

    存储已生成密钥的输出文件。

    bs=n

    密钥大小(以字节为单位)。要获取字节长度,请将密钥位的比特长度除以 8。

    count=n

    输入块的计数。n 的数值应为 1

  3. 将密钥存储在受保护的目录中。

    密钥文件不应被除用户之外的任何人读取。


    % 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

Procedure如何计算文件摘要

计算文件摘要时,可以通过比较摘要输出来查看文件是否被篡改。摘要不会修改原始文件。

  1. 列出可用摘要算法。


    % digest -l
    
    md5
    
    sha1
  2. 计算文件摘要并保存摘要列表。

    digest 命令提供一种算法。


    % digest -v -a algorithm input-file > digest-listing
    
    -v

    显示以下格式的输出:


    algorithm (input-file) = digest
    
    -a algorithm

    用于计算文件摘要的算法。键入与步骤 1 的输出中显示的算法相同的算法。

    input-file

    digest 命令的输入文件。

    digest-listing

    digest 命令的输出文件。


示例 14–5 使用 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–6 使用 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

Procedure如何计算文件的 MAC

消息验证代码或 MAC 会计算文件的摘要并使用密钥进一步保护该摘要。MAC 不会修改原始文件。

  1. 列出可用机制。


    % mac -l
    
    Algorithm       Keysize:  Min   Max
    
    -----------------------------------
    
    des_mac                    64    64
    
    sha1_hmac                   8   512
    
    md5_hmac                    8   512
  2. 生成相应长度的对称密钥。

    您有两种选择。可以提供将根据其生成密钥的 passphrase(口令短语)。或者,可以提供密钥。

    • 如果提供口令短语,则必须存储或记住该口令短语。如果您在线存储口令短语,则只有您才可以读取该口令短语文件。

    • 如果提供密钥,则它必须是对应于机制的正确大小。有关过程,请参见如何生成对称密钥

  3. 创建文件的 MAC。

    mac 命令提供密钥并使用对称密钥算法。


    % mac -v -a algorithm [ -k keyfile ] input-file
    
    -v

    显示以下格式的输出:


    algorithm (input-file) = mac
    
    -a algorithm

    用于计算 MAC 的算法。键入与 mac -l 命令的输出中显示的算法相同的算法。

    -k keyfile

    包含算法所指定长度的密钥的文件。

    input-file

    MAC 的输入文件。


示例 14–7 使用 DES_MAC 和口令短语计算 MAC

在以下示例中,将使用 DES_MAC 机制和派生于口令短语的密钥对电子邮件附件进行验证。MAC 列表将保存到文件中。如果口令短语存储在某个文件中,则除了该用户之外,其他任何人都不能读取该文件。


% mac -v -a des_mac email.attach

Enter key: <键入口令短语>

des_mac (email.attach) = dd27870a

% echo "des_mac (email.attach) = dd27870a" >> ~/desmac.daily.05.07


示例 14–8 使用 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–9 使用 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

Procedure如何加密和解密文件

加密文件时,不会删除或更改原始文件。输出文件将被加密。

有关 encrypt 命令的常见错误的解决方案,请参见示例后面的部分。

  1. 创建适当长度的对称密钥。

    您有两种选择。可以提供将根据其生成密钥的 passphrase(口令短语)。或者,可以提供密钥。

    • 如果提供口令短语,则必须存储或记住该口令短语。如果您在线存储口令短语,则只有您才可以读取该口令短语文件。

    • 如果提供密钥,则它必须是对应于机制的正确大小。有关过程,请参见如何生成对称密钥

  2. 加密文件。

    encrypt 命令提供密钥并使用对称密钥算法。


    % encrypt -a algorithm  [ -k keyfile ] -i input-file -o output-file
    
    -a algorithm

    用于加密文件的算法。 键入与 encrypt -l 命令的输出中显示的算法相同的算法。

    -k keyfile

    包含算法所指定长度的密钥的文件。 每种算法的密钥长度(以位为单位)列在 encrypt -l 命令的输出中。

    -i input-file

    要加密的输入文件。命令不会更改此文件。

    -o output-file

    加密格式的输入文件的输出文件。


示例 14–10 使用 AES 和口令短语进行加密和解密

在以下示例中,将使用 AES 算法加密文件。密钥根据口令短语生成。如果口令短语存储在某个文件中,则除了该用户之外,其他任何人都不能读取该文件。


% encrypt -a aes -i ticket.to.ride -o ~/enc/e.ticket.to.ride

Enter key: <键入口令短语>

输入文件 ticket.to.ride 仍然以其原始格式存在。

要解密输出文件,用户应使用加密该文件的相同口令短语和加密机制。


% decrypt -a aes -i ~/enc/e.ticket.to.ride -o ~/d.ticket.to.ride

Enter key: <键入口令短语>


示例 14–11 使用 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–12 使用 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–13 使用 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 命令的密钥。

如果所提供的密钥不满足算法要求,则必须提供正确的密钥。