shell脚本学习指南[四](Arnold Robbins & Nelson H.F. Beebe著)

2019-09-23 09:42:05丽君

$ md5sum /bin/l?
57e35260b8e017f4696b8559ed4f32f2 /bin/ln
0f68a291df1a708e130e0f407a67e9ca /bin/ls
输出结果有32个十六进制数,等同128位,因此两个不同文件最后散列出相同签名的可能性非常低。了解这个后可以写一个简单脚本来实现我们之前的目标了。


#! /bin/sh -
# 根据他们的MD5校验和,显示某种程度上内容机会一直的文件名
#
# 语法:
#       show-indentical-files files

IFS='
    '
PATH=/usr/local/bin:/usr/bin:/bin
export PATH

md5sum "$@" /dev/null 2> /dev/null |
    awk '{
            count[$1]++
            if( count[$1] ==1 ) first[$1]=$0
            if( count[$1] ==2 ) print first[$1]
            if( count[$1] >1 )  print $0
        }' |
    sort | awk '{
            if ( last != $1 ) print ""
            last = $1
            print
            }'

程序很简单,就不弄注释了吧。可以测试一下:
$ show-indentical-files /bin/*
发现好多命令都很能装啊,其实内容都一样的 - -!。

这里说一下数字签名验证,很有用。
软件发布的时候,一般会包含分发文件的校验和,这可以让你方便得知所下载的文件是否与原始文件匹配。不过单独的校验和不能提供验证(verification)工作:如果校验和被记录在你下载软件里的另一个文件中,则攻击者可以恶意的修改软件,然后只需要相应的修改校验和即可。
这个问题的解决方案是公钥加密(public-key cryptography)。在这种机制下,数据的安全保障来自两个相关密钥的存在:一个私密密钥,只有所有者知悉,以及一个公开密钥,任何人都可得知。两个密钥的其中一个用以加密,另一个则用于解密。公开密钥加密的安全性,依赖已知的公开密钥及可被该密钥解密的文本,以提供一条没有实际用途的信息但可被用来回复私密密钥。这一发明最大的突破是解决了一直以来密码学上极为严重的问题:在需要彼此沟通的对象之间,如何安全的交换加密密钥。
私密密钥与公开密钥是如何使用和运作的呢?假设Alice想对一个公开文件签名,她可以使用她的私密密钥(private key)为文件加密。之后Bob再使用Alice的公开密钥(public key)将签名后的文件解密,这么一来即可确信该文件为Alice所签名,而Alice无须泄漏其私密密钥,就能让文件得到信任。