2.8 加密工具与散列

加密技术主要用于防止数据遭受未经授权的访问。加密算法有很多,我们会着重讲解那些常见的标准加密算法。在Linux环境下有一些工具可以用来执行加密和解密。有时我们使用加密算法散列值来验证数据的完整性。本节将介绍一些常用的加密工具以及这些工具所涉及的算法。

实战演练

让我们看看cryptgpgbase64md5sumsha1sum以及openssl的用法。

  • crypt是一个简单的加密工具,它从stdin接受一个文件以及口令作为输入,然后将加密数据输出到Stdout(因此要对输入、输出文件使用重定向)。

    $ crypt <input_file >output_file
    Enter passphrase:
    

    它会要求输入一个口令。我们也可以通过命令行参数来提供口令。

    $ crypt PASSPHRASE <input_file >encrypted_file
    

    如果需要解密文件,可以使用:

    $ crypt PASSPHRASE -d <encrypted_file >output_file
    
  • gpg(GNU隐私保护)是一种应用广泛的工具,它使用加密技术来保护文件,以确保数据在送达目的地之前无法被读取。这里我们讨论如何加密、解密文件。

    gpg签名同样广泛用于在电子邮件通信中的邮件“签名”,以证明发送方的真实性。

    gpg加密文件:

    $ gpg -c filename
    

    该命令采用交互方式读取口令,并生成filename.gpg。使用以下命令解密gpg文件:

    $ gpg filename.gpg
    

    该命令读取口令,然后对文件进行解密。

    本书并没有涉及gpg的过多细节。如果你感兴趣,希望进一步了解,请访问http://en.wikipedia.org/wiki/GNU_Privacy_Guard

  • Base64是一组相似的编码方案,它将ASCII字符转换成以64为基数的形式(radix-64 representation),以可读的ASCII字符串来描述二进制数据。base64命令可以用来编码/解码Base64字符串。要将文件编码为Base64格式,可以使用:

    $ base64 filename > outputfile
    

    或者

    $ cat file | base64 > outputfile
    

    base64可以从stdin中进行读取。

    解码Base64数据:

    $ base64 -d file > outputfile
    

    或者

    $ cat base64_file | base64 -d > outputfile
    
  • md5sum与sha1sum都是单向散列算法,均无法逆推出原始数据。它们通常用于验证数据完整性或为特定数据生成唯一的密钥:

    $ md5sum file
    8503063d5488c3080d4800ff50850dc9  file
     
    $ sha1sum file
    1ba02b66e2e557fede8f61b7df282cd0a27b816b  file
    

    这种类型的散列算法是存储密码的理想方案。密码使用其对应的散列值来存储。如果某个用户需要进行认证,读取该用户提供的密码并转换成散列值,然后将其与之前存储的散列值进行比对。如果相同,用户就通过认证,被允许访问;否则,就会被拒绝访问。将密码以明文形式存储是件非常冒险的事,会面临安全风险。

    尽管使用广泛,md5sum和SHA-1已不再安全。因为计算能力的攀升使其变得容易被破解。推荐使用bcryptsha512sum这类工具进行加密。详情可参看http://codahale.com/how-to-saftyly-store-a-password/

  • shadow-like散列(salt散列)

    让我们看看如何为密码生成shadow-like salt散列。在Linux中,用户密码是以散列值形式存储在文件 /etc/shadow中的。该文件中的典型内容类似于下面这样:

    test:$6$fG4eWdUi$ohTKOlEUzNk77.4S8MrYe07NTRV4M3LrJnZP9p.qc1bR5c.EcOruzPXfEu1uloBFUa18ENRH7F70zhodas3cR.:14790:0:99999:7:::
    

    该行中的$6$fG4eWdUi$ohTKOlEUzNk77.4S8MrYe07NTRV4M3LrJnZP9p.qc1bR5c.EcOruzPXfEu1uloBFUa18ENRH7F70zhodas3cR是密码对应的shadow散列值。

    某些情况下,我们得编写一些至关重要的管理脚本,这些脚本也许需要编辑密码,或是需要用shell脚本手动添加用户。这时我们必须生成shadow密码字符串,并向shadow文件中写入与上面类似的文本行。下面让我们看看如何用openssl生成shadow密码。

    shadow密码通常都是salt密码。所谓SALT就是额外的一个字符串,用来起一个混淆的作用,使加密更加不易被破解。salt由一些随机位组成,被用作密钥生成函数的输入之一,以生成密码的salt散列值。

    关于 salt 的更多细节信息,请参考维基百科页面 http://en.wikipedia.org/wiki/Salt_(cryptography)

    $ opensslpasswd -1 -salt SALT_STRING PASSWORD
    $1$SALT_STRING$323VkWkSLHuhbt1zkSsUG.
    

    SALT_STRING替换为随机字符串,并将PASSWORD替换成你想要使用的密码。