6.9 加密工具与散列

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

实战演练

让我们看看crypt、gpg、base64、md5sum、sha1sum以及openssl的用法。

  • crypt

crypt是一个简单的加密工具,它从stdin接受一个文件以及口令(passphrase)作为输入,然后将加密数据输出到output

  1. $ crypt <input_file> output_file
  2. Enter passphrase:

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

  1. $ crypt PASSPHRASE < input_file > encrypted_file

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

  1. $ crypt PASSPHRASE -d < encrypted_file > output_file
  • gpg

gpg(GNU privacy guard,GNU 隐私保护)是一种应用广泛的加密方案,它采用密钥签名技术保护文件内容,只有经过认证的用户才能访问数据。我们对gpg签名早已耳熟能详。不过,gpg的技术细节已经超出了本书讨论的范围,在这里我们只学习如何用它对文件进行加密和解密。

用gpg加密文件:

  1. $ gpg -c filename

这条命令采用交互方式读取口令,并生成filename.gpg。

解密gpg文件:

  1. $ gpg filename.gpg

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

  • Base64

Base64是一组类似的编码方案(encoding scheme),它通过将ASCII字符转换成以64为基数的形式(radix-64 representation)来用ASCII字符串描述二进制数据。base64可以用来对编码和解码Base64字符串。

要将文件编码为Base64格式,可以使用:

  1. $ base64 filename > outputfile

或者

  1. $ cat file | base64 > outputfile

base64可以从stdin中进行读取。

按照下面的方法解码Base64数据:

  1. $ base64 -d file > outputfile

或者

  1. $ cat base64_file | base64 -d > outputfile
  • md5sum与sha1sum

md5sum与sha1sum都是单向散列算法(unidirectional hash algorithm),均无法逆推出原始数据。它们通常用于验证数据完整性或为特定数据生成唯一的密钥,因为通过分析文件内容,它们可以为每个文件生成一个唯一的密钥。

  1. $ md5sum file
  2. 8503063d5488c3080d4800ff50850dc9 file
  3.  
  4. $ sha1sum file
  5. 1ba02b66e2e557fede8f61b7df282cd0a27b816b file

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

  • shadowlike散列(salted散列)

让我们看看如何为密码生成shadowlike salted散列。

在Linux中,用户密码是以散列值形式存储在文件 /etc/shadow中的。该文件中一行典型的内容类似于这样:

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

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

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

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

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

  1. $ openssl passwd -1 -salt SALT_STRING PASSWORD
  2. $1$SALT_STRING$323VkWkSLHuhbt1zkSsUG.

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