标签 加密 下的文章

VeraCrypt 提供跨平台的开源文件加密功能。

 title=

许多年前,有一个名为 TrueCrypt 的加密软件。它的源码是可以得到的,尽管没有任何人声称曾对它进行过审计或贡献过。它的作者是(至今仍是)匿名的。不过,它是跨平台的,易于使用,而且真的非常有用。

TrueCrypt 允许你创建一个加密的文件“保险库”,在那里你可以存储任何类型的敏感信息(文本、音频、视频、图像、PDF 等)。只要你有正确的口令,TrueCrypt 就可以解密保险库,并在任何运行 TrueCrypt 的电脑上提供读写权限。这是一项有用的技术,它基本上提供了一个虚拟的、可移动的、完全加密的驱动器(除了文件以外),你可以在其中安全地存储你的数据。

TrueCrypt 最终关闭了,但一个名为 VeraCrypt 的替代项目迅速兴起,填补了这一空白。VeraCrypt 基于 TrueCrypt 7.1a,比原来的版本有许多改进(包括标准加密卷和引导卷的算法的重大变化)。在 VeraCrypt 1.12 及以后的版本中,你可以使用自定义迭代来提高加密安全性。更好的是,VeraCrypt 可以加载旧的 TrueCrypt 卷,所以如果你是 TrueCrypt 用户,可以很容易地将它们转移到 VeraCrypt 上。

安装 VeraCrypt

你可以从 VeraCrypt 下载页面 下载相应的安装文件,之后在所有主流平台上安装 VeraCrypt。

另外,你也可以自己从源码构建它。在 Linux 上,它需要 wxGTK3、makeself 和通常的开发栈(Binutils、GCC 等)。

当你安装后,从你的应用菜单中启动 VeraCrypt。

创建一个 VeraCrypt 卷

如果你刚接触 VeraCrypt,你必须先创建一个 VeraCrypt 加密卷(否则,你没有任何东西可以解密)。在 VeraCrypt 窗口中,点击左侧的 “Create Volume” 按钮。

 title=

在出现的 VeraCrypt 的卷创建向导窗口中,选择要创建一个加密文件容器还是要加密整个驱动器或分区。向导将为你的数据创建一个保险库,所以请按照提示进行操作。

在本文中,我创建了一个文件容器。VeraCrypt 容器和其他文件很像:它保存在硬盘、外置硬盘、云存储或其他任何你能想到的存储数据的地方。与其他文件一样,它可以被移动、复制和删除。与大多数其他文件不同的是,它可以\_容纳\_更多的文件,这就是为什么我认为它是一个“保险库”,而 VeraCrypt 开发者将其称为“容器”。它的开发者将 VeraCrypt 文件称为“容器”,是因为它可以包含其他数据对象;它与 LXC、Kubernetes 和其他现代 IT 机制所流行的容器技术无关。

选择一个文件系统

在创建卷的过程中,你会被要求选择一个文件系统来决定你放在保险库中的文件的存储方式。微软 FAT 格式是过时的、非日志型,并且限制了卷和文件的大小,但它是所有平台都能读写的一种格式。如果你打算让你的 VeraCrypt 保险库跨平台,FAT 是你最好的选择。

除此之外,NTFS 适用于 Windows 和 Linux。开源的 EXT 系列适用于 Linux。

挂载 VeraCrypt 加密卷

当你创建了 VeraCrypt 卷,你就可以在 VeraCrypt 窗口中加载它。要挂载一个加密库,点击右侧的 “Select File” 按钮。选择你的加密文件,选择 VeraCrypt 窗口上半部分的一个编号栏,然后点击位于 VeraCrypt 窗口左下角的 “Mount” 按钮。

你挂载的卷在 VeraCrypt 窗口的可用卷列表中,你可以通过文件管理器访问该卷,就像访问一个外部驱动器一样。例如,在 KDE 上,我打开 Dolphin,进入 /media/veracrypt1,然后我就可以把文件复制到我的保险库里。

只要你的设备上有 VeraCrypt,你就可以随时访问你的保险库。在你手动在 VeraCrypt 中挂载之前,文件都是加密的,在那里,文件会保持解密,直到你再次关闭卷。

关闭 VeraCrypt 卷

为了保证你的数据安全,当你不需要打开 VeraCrypt 卷时,关闭它是很重要的。这样可以保证数据的安全,不被人窥视,且不被人趁机犯罪。

 title=

关闭 VeraCrypt 容器和打开容器一样简单。在 VeraCrypt 窗口中选择列出的卷,然后点击 “Dismount”。你就不能访问保险库中的文件了,其他人也不会再有访问权。

VeraCrypt 轻松实现跨平台加密

有很多方法可以保证你的数据安全,VeraCrypt 试图为你提供方便,而无论你需要在什么平台上使用这些数据。如果你想体验简单、开源的文件加密,请尝试 VeraCrypt。


via: https://opensource.com/article/21/4/open-source-encryption

作者:Seth Kenlon 选题:lujun9972 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

使用 Linux 统一密钥设置(LUKS)为物理驱动器或云存储上的敏感文件创建一个加密保险库。

 title=

最近,我演示了如何在 Linux 上使用 统一密钥设置 Linux Unified Key Setup LUKS)和 cryptsetup 命令 实现全盘加密。虽然加密整个硬盘在很多情况下是有用的,但也有一些原因让你不想对整个硬盘进行加密。例如,你可能需要让一个硬盘在多个平台上工作,其中一些平台可能没有集成 LUKS。此外,现在是 21 世纪,由于云的存在,你可能不会使用物理硬盘来处理所有的数据。

几年前,有一个名为 TrueCrypt 的系统,允许用户创建加密的文件保险库,可以通过 TrueCrypt 解密来提供读/写访问。这是一项有用的技术,基本上提供了一个虚拟的便携式、完全加密的驱动器,你可以在那里存储重要数据。TrueCrypt 项目关闭了,但它可以作为一个有趣的模型。

幸运的是,LUKS 是一个灵活的系统,你可以使用它和 cryptsetup 在一个独立的文件中创建一个加密保险库,你可以将其保存在物理驱动器或云存储中。

下面就来介绍一下怎么做。

1、建立一个空文件

首先,你必须创建一个预定大小的空文件。就像是一种保险库或保险箱,你可以在其中存储其他文件。你使用的命令是 util-linux 软件包中的 fallocate

$ fallocate --length 512M vaultfile.img

这个例子创建了一个 512MB 的文件,但你可以把你的文件做成任何你想要的大小。

2、创建一个 LUKS 卷

接下来,在空文件中创建一个 LUKS 卷:

$ cryptsetup --verify-passphrase \
    luksFormat vaultfile.img

3、打开 LUKS 卷

要想创建一个可以存储文件的文件系统,必须先打开 LUKS 卷,并将其挂载到电脑上:

$ sudo cryptsetup open \
    --type luks vaultfile.img myvault
$ ls /dev/mapper
myvault

4、建立一个文件系统

在你打开的保险库中建立一个文件系统:

$ sudo mkfs.ext4 -L myvault /dev/mapper/myvault

如果你现在不需要它做什么,你可以关闭它:

$ sudo cryptsetup close myvault

5、开始使用你的加密保险库

现在一切都设置好了,你可以在任何需要存储或访问私人数据的时候使用你的加密文件库。要访问你的保险库,必须将其挂载为一个可用的文件系统:

$ sudo cryptsetup open \
    --type luks vaultfile.img myvault
$ ls /dev/mapper
myvault
$ sudo mkdir /myvault
$ sudo mount /dev/mapper/myvault /myvault

这个例子用 cryptsetup 打开保险库,然后把保险库从 /dev/mapper 下挂载到一个叫 /myvault 的新目录。和 Linux 上的任何卷一样,你可以把 LUKS 卷挂载到任何你想挂载的地方,所以除了 /myvault,你可以用 /mnt~/myvault 或任何你喜欢的位置。

当它被挂载后,你的 LUKS 卷就会被解密。你可以像读取和写入文件一样读取和写入它,就像它是一个物理驱动器一样。

当使用完你的加密保险库时,请卸载并关闭它:

$ sudo umount /myvault
$ sudo cryptsetup close myvault

加密的文件保险库

你用 LUKS 加密的镜像文件和其他文件一样,都是可移动的,因此你可以将你的保险库存储在硬盘、外置硬盘,甚至是互联网上。只要你可以使用 LUKS,就可以解密、挂载和使用它来保证你的数据安全。轻松加密,提高数据安全性,不妨一试。


via: https://opensource.com/article/21/4/linux-encryption

作者:Seth Kenlon 选题:lujun9972 译者:wxy 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

通过使用网络绑定磁盘加密(NBDE),无需手动输入密码即可打开加密磁盘。

从安全的角度来看,对敏感数据进行加密以保护其免受窥探和黑客的攻击是很重要的。 Linux 统一密钥设置 Linux Unified Key Setup LUKS)是一个很好的工具,也是 Linux 磁盘加密的通用标准。因为它将所有相关的设置信息存储在分区头部中,所以它使数据迁移变得简单。

要使用 LUKS 配置加密磁盘或分区,你需要使用 cryptsetup 工具。不幸的是,加密磁盘的一个缺点是,每次系统重启或磁盘重新挂载时,你都必须手动提供密码。

然而, 网络绑定磁盘加密 Network-Bound Disk Encryption (NBDE) 可以在没有任何用户干预的情况下自动安全地解锁加密磁盘。它可以在一些 Linux 发行版中使用,包括从 Red Hat Enterprise Linux 7.4、CentOS 7.4 和 Fedora 24 开始,以及之后的后续版本。

NBDE 采用以下技术实现:

  • Clevis 框架:一个可插拔的框架工具,可自动解密和解锁 LUKS 卷
  • Tang 服务器:用于将加密密钥绑定到网络状态的服务

Tang 向 Clevis 客户端提供加密密钥。据 Tang 的开发人员介绍,这为密钥托管服务提供了一个安全、无状态、匿名的替代方案。

由于 NBDE 使用客户端-服务器架构,你必须同时配置客户端和服务器。你可以在你的本地网络上使用一个虚拟机作为 Tang 服务器。

服务器安装

用 sudo 安装 Tang:

sudo yum install tang -y

启用 Tang 服务器:

sudo systemctl enable tangd.socket --now

Tang 服务器工作在 80 端口,需加入到 firewalld 防火墙。添加相应的 firewalld 规则:

sudo  firewall-cmd --add-port=tcp/80 --perm
sudo firewall-cmd --reload

现在安装好了服务器。

客户端安装

在本例中,假设你已经添加了一个名为 /dev/vdc 的新的 1GB 磁盘到你的系统中。

使用 fdiskparted 创建主分区:

sudo fdisk /dev/vdc

完成以下步骤来安装客户端:

Welcome to fdisk (util-linux 2.23.2).

Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Device does not contain a recognized partition table
Building a new DOS disklabel with disk identifier 0x4a6812d4.

Command (m for help):

输入 n 来创建新的分区:

Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended  
Select (default p):

按下回车键选择主分区:

Using default response p
Partition number (1-4, default 1):

按下回车键选择默认分区号:

First sector (2048-2097151, default 2048):
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-2097151, default 2097151):

按回车键选择最后一个扇区:

Using default value 2097151
Partition 1 of type Linux and of size 1023 MiB is set

Command (m for help): wq

输入 wq 保存更改并退出 fdisk

The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

运行 partprobe 通知系统分区表的变化:

sudo partprobe

使用 sudo 安装 cryptsetup 软件包:

sudo yum install cryptsetup -y

使用 cryptsetup luksFormat 命令对磁盘进行加密。当提示时,你需要输入大写的 YES,并输入密码来加密磁盘:

sudo cryptsetup luksFormat /dev/vdc1
WARNING!
========
This will overwrite data on /dev/vdc1 irrevocably.

Are you sure? (Type uppercase yes):

Enter passphrase for /dev/vdc1:
Verify passphrase:

使用 cryptsetup luksOpen 命令将加密的分区映射到一个逻辑设备上。例如,使用 encryptedvdc1 作为名称。你还需要再次输入密码:

sudo cryptsetup luksOpen /dev/vdc1 encryptedvdc1
Enter passphrase for /dev/vdc1:

加密分区现在在 /dev/mapper/encryptedvdc1 中可用。

在加密的分区上创建一个 XFS 文件系统:

sudo mkfs.xfs /dev/mapper/encryptedvdc1

创建一个挂载加密分区的目录:

sudo mkdir /encrypted

使用 cryptsetup luksClose 命令锁定分区:

cryptsetup luksClose encryptedvdc1

使用 sudo 安装 Clevis 软件包:

sudo yum install clevis clevis-luks clevis-dracut -y

修改 /etc/crypttab,在启动时打开加密卷:

sudo vim /etc/crypttab

增加以下一行:

encryptedvdc1       /dev/vdc1  none   _netdev

修改 /etc/fstab,在重启时或启动时自动挂载加密卷:

sudo vim /etc/fstab

增加以下一行:

/dev/mapper/encryptedvdc1   /encrypted       xfs    _netdev        1 2

在这个例子中,假设 Tang 服务器的 IP 地址是 192.168.1.20。如果你喜欢,也可以使用主机名或域名。

运行以下 clevis 命令:

sudo clevis bind luks -d /dev/vdc1 tang '{"url":"http://192.168.1.20"}'
The advertisement contains the following signing keys:

rwA2BAITfYLuyNiIeYUMBzkhk7M

Do you wish to trust these keys? [ynYN] Y
Enter existing LUKS password:

输入 Y 接受 Tang 服务器的密钥,并提供现有的 LUKS 密码进行初始设置。

通过 systemctl 启用 clevis-luks-askpass.path,以防止非根分区被提示输入密码。

sudo systemctl enable clevis-luks-askpass.path

客户端已经安装完毕。现在,每当你重启服务器时,加密后的磁盘应该会自动解密,并通过 Tang 服务器取回密钥进行挂载。

如果 Tang 服务器因为任何原因不可用,你需要手动提供密码,才能解密和挂载分区。


via: https://opensource.com/article/20/11/nbde-linux

作者:Curt Warfield 选题:lujun9972 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

这种使用 Python 和 Shamir 秘密共享的独特算法可以保护你的主密码,可以有效避免黑客窃取和自己不经意忘记引发的风险和不便。

很多人使用密码管理器来保密存储自己在用的各种密码。密码管理器的关键环节之一是主密码,主密码保护着所有其它密码。这种情况下,主密码本身就是风险所在。任何知道你的主密码的人,都可以视你的密码保护若无物,畅行无阻。自然而然,为了保证主密码的安全性,你会选用很难想到的密码,把它牢记在脑子里,并做所有其他你应该做的事情。

但是万一主密码泄露了或者忘记了,后果是什么?也许你去了个心仪的岛上旅行上个把月,没有现代技术覆盖,在开心戏水之后享用美味菠萝的时刻,突然记不清自己的密码是什么了。是“山巅一寺一壶酒”?还是“一去二三里,烟村四五家”?反正当时选密码的时候感觉浑身都是机灵,现在则后悔当初何必作茧自缚。

 title=

XKCD, CC BY-NC 2.5

当然,你不会把自己的主密码告诉其它任何人,因为这是密码管理的首要原则。有没有其它变通的办法,免除这种难以承受的密码之重?

试试 Shamir 秘密共享算法 Shamir's Secret Sharing ,这是一种可以将保密内容进行分块保存,且只能将片段拼合才能恢复保密内容的算法。

先分别通过一个古代的和一个现代的故事,看看 Shamir 秘密共享算法究竟是怎么回事吧。

这些故事的隐含前提是你对密码学有起码的了解,必要的话,你可以先温习一下 密码学与公钥基础设施引论.

一个古代关于加解密的故事

古代某国,国王有个大秘密,很大很大的秘密:

def int_from_bytes(s):
    acc = 0
    for b in s:
        acc = acc * 256
        acc += b
    return acc

secret = int_from_bytes("terrible secret".encode("utf-8"))

大到连他自己的孩子都不能轻易信任。他有五个子女,但他知道前路危机重重。他的孩子需要在他百年之后用这个秘密来保卫国家,而国王又不能忍受自己的孩子在他们还记得自己的时候就知道这些秘密,尤其是这种状态可能要持续几十年。

所以,国王动用大力魔术,将这个秘密分为了五个部分。他知道,可能有一两个孩子不会遵从他的遗嘱,但绝对不会同时有三个或三个以上会这样:

from mod import Mod
from os import urandom

国王精通 有限域随机 魔法,当然,对他来说,使用巨蟒分割这个秘密也是小菜一碟。

第一步是选择一个大质数——第 13 个 梅森质数2**521 - 1),他让人把这个数铸造在巨鼎上,摆放在大殿上:

P = 2**521 - 1

但这不是要保密的秘密:这只是 公开数据

国王知道,如果 P 是一个质数,用 P 对数字取模,就形成了一个数学 ):在场中可以自由进行加、减、乘、除运算。当然,做除法运算时,除数不能为 0。

国王日理万机,方便起见,他在做模运算时使用了 PyPI 中的 mod 模块,这个模块实现了各种模数运算算法。

他确认过,自己的秘密比 P 要短:

secret < P
TRUE

将秘密转换为 P 的模,mod P

secret = mod.Mod(secret, P)

为了使任意三个孩子掌握的片段就可以重建这个秘密,他还得生成另外两个部分,并混杂到一起:

polynomial = [secret]
for i in range(2):
    polynomial.append(Mod(int_from_bytes(urandom(16)), P))
len(polynomial)
3

下一步就是在随机选择的点上计算某 多项式 的值,即计算 polynomial[0] + polynomial[1]*x + polynomial[2]*x**2 ...

虽然有第三方模块可以计算多项式的值,但那并不是针对有限域内的运算的,所以,国王还得亲自操刀,写出计算多项式的代码:

def evaluate(coefficients, x):
    acc = 0
    power = 1
    for c in coefficients:
        acc += c * power
        power *= x
    return acc

再下一步,国王选择五个不同的点,计算多项式的值,并分别交给五个孩子,让他们各自保存一份:

shards = {}
for i in range(5):
    x = Mod(int_from_bytes(urandom(16)), P)
    y = evaluate(polynomial, x)
    shards[i] = (x, y)

正如国王所虑,不是每个孩子都正直守信。其中有两个孩子,在他尸骨未寒的时候,就想从自己掌握的秘密片段中窥出些什么,但穷极所能,终无所获。另外三个孩子听说了这个事,合力将这两人永远驱逐:

del shards[2]
del shards[3]

二十年弹指一挥间,奉先王遗命,三个孩子将合力恢复出先王的大秘密。他们将各自的秘密片段拼合在一起:

retrieved = list(shards.values())

然后是 40 天没日没夜的苦干。这是个大工程,他们虽然都懂些 Python,但都不如前国王精通。

最终,揭示秘密的时刻到了。

用于反算秘密的代码基于 拉格朗日差值,它利用多项式在 n 个非 0 位置的值,来计算其在 0 处的值。前面的 n 指的是多项式的阶数。这个过程的原理是,可以为一个多项式找到一个显示方程,使其满足:其在 t[0] 处的值是 1,在 i 不为 0 的时候,其在 t[i] 处的值是 0。因多项式值的计算属于线性运算,需要计算 这些 多项式各自的值,并使用多项式的值进行插值:

from functools import reduce
from operator import mul

def retrieve_original(secrets):
    x_s = [s[0] for s in secrets]
    acc = Mod(0, P)
    for i in range(len(secrets)):
        others = list(x_s)
        cur = others.pop(i)
        factor = Mod(1, P)
        for el in others:
            factor *= el * (el - cur).inverse()
        acc += factor * secrets[i][1]
    return acc

这代码是在太复杂了,40 天能算出结果已经够快了。雪上加霜的是,他们只能利用五个秘密片段中的三个来完成这个运算,这让他们万分紧张:

retrieved_secret = retrieve_original(retrieved)

后事如何?

retrieved_secret == secret
TRUE

数学这个魔术的优美之处就在于它每一次都是那么靠谱,无一例外。国王的孩子们,曾经的孩童,而今已是壮年,足以理解先王的初衷,并以先王的锦囊妙计保卫了国家,并继之以繁荣昌盛!

关于 Shamir 秘密共享算法的现代故事

现代,很多人都对类似的大秘密苦不堪言:密码管理器的主密码!几乎没有谁能有足够信任的人去完全托付自己最深的秘密,好消息是,找到至少有三个不会串通起来搞鬼的五人组不是个太困难的事。

同样是在现代,比较幸运的是,我们不必再像国王那样自己动手分割要守护的秘密。拜现代 开源 技术所赐,这都可以使用现成的软件完成。

假设你有五个不敢完全信任,但还可以有点信任的人:张三、李四、王五、赵六和钱大麻子。

安装并运行 ssss 分割密钥:

$ echo 'long legs travel fast' | ssss-split -t 3 -n 5
Generating shares using a (3,5) scheme with dynamic security level.
Enter the secret, at most 128 ASCII characters: Using a 168 bit security level.
1-797842b76d80771f04972feb31c66f3927e7183609
2-947925f2fbc23dc9bca950ef613da7a4e42dc1c296
3-14647bdfc4e6596e0dbb0aa6ab839b195c9d15906d
4-97c77a805cd3d3a30bff7841f3158ea841cd41a611
5-17da24ad63f7b704baed220839abb215f97d95f4f8

这确实是个非常牛的主密码:long legs travel fast,绝不能把它完整的托付给任何人!那就把五个片段分别交给还比较可靠的伙伴,张三、李四、王五、赵六和钱大麻子。

  • 1 给张三。
  • 2 给李四。
  • 3 给王五。
  • 4 给赵六。
  • 5 给钱大麻子。

然后,你开启你的惬意之旅,整整一个月,流连于海边温暖的沙滩,整整一个月,没碰过任何电子设备。没用多久,把自己的主密码忘到了九霄云外。

李四和王五也在和你一起旅行,你托付给他们保管的密钥片段保存的好好的,在他们各自的密码管理器中,但不幸的是,他们和你一样,也忘了自己的 主密码

没关系。

联系张三,他保管的密钥片段是 1-797842b76d80771f04972feb31c66f3927e7183609;赵六,一直替你的班,很高兴你能尽快重返岗位,把自己掌握的片段给了你,4-97c77a805cd3d3a30bff7841f3158ea841cd41a611;钱大麻子,收到你给的跑腿费才将自己保管的片段翻出来发给你,5-17da24ad63f7b704baed220839abb215f97d95f4f8

有了这三个密钥片段,运行:

$ ssss-combine -t 3
Enter 3 shares separated by newlines:
Share [1/3]: 1-797842b76d80771f04972feb31c66f3927e7183609
Share [2/3]: 4-97c77a805cd3d3a30bff7841f3158ea841cd41a611
Share [3/3]: 5-17da24ad63f7b704baed220839abb215f97d95f4f8
Resulting secret: long legs travel fast

就这么简单,有了 开源 技术加持,你也可以活的像国王一样滋润!

自己的安全不是自己一个人的事

密码管理是当今网络生活必备技能,当然要选择复杂的密码,来保证安全性,但这不是全部。来用 Shamir 秘密共享算法,和他人共同安全的存储你的密码吧。


via: https://opensource.com/article/20/6/python-passwords

作者:Moshe Zadka 选题:lujun9972 译者:silentdawn-zz 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

从输出的哈希值反推回输入,这从计算的角度是不可行的。

无论安全从业人员用计算机做什么,有一种工具对他们每个人都很有用:加密 哈希(散列) hash 函数。这听起来很神秘、很专业,甚至可能有点乏味,但是, 在这里,关于什么是哈希函数以及它们为什么对你很重要,我会作出一个简洁的解释。

加密哈希函数,比如 SHA-256 或者 MD5,接受一组二进制数据(通常是字节)作为输入,并且对每个可能的输入集给出一个 希望唯一 hopefully unique 的输出。对于任意模式的输入,给定的哈希函数的输出(“哈希值”)的长度都是一样的(对于 SHA-256,是 32 字节或者 256 比特,这从名字中就能看出来)。最重要的是:从输出的哈希值反推回输入,这从计算的角度是 不可行的 implausible (密码学家讨厌 “ 不可能 impossible ” 这个词)。这就是为什么它们有时候被称作 单向哈希函数 one-way hash function

但是哈希函数是用来做什么的呢?为什么“唯一”的属性如此重要?

唯一的输出

在描述哈希函数的输出时,“ 希望唯一 hopefully unique ”这个短语是至关重要的,因为哈希函数就是用来呈现完全唯一的输出。比如,哈希函数可以用于验证 下载的文件副本的每一个字节是否和 下载的文件一样。你下载一个 Linux 的 ISO 文件或者从 Linux 的仓库中下载软件时,你会看到使用这个验证过程。没有了唯一性,这个技术就没用了,至少就通常的目的而言是这样的。

如果两个不同的输入产生了相同的输出,那么这样的哈希过程就称作“ 碰撞 collision ”。事实上,MD5 算法已经被弃用,因为虽然可能性微乎其微,但它现在可以用市面上的硬件和软件系统找到碰撞。

另外一个重要的特性是,消息中的一个微小变化,甚至只是改变一个比特位,都可能会在输出中产生一个明显的变化(这就是“ 雪崩效应 avalanche effect ”)。

验证二进制数据

哈希函数的典型用途是当有人给你一段二进制数据,确保这些数据是你所期望的。无论是文本、可执行文件、视频、图像或者一个完整的数据库数据,在计算世界中,所有的数据都可以用二进制的形式进行描述,所以至少可以这么说,哈希是广泛适用的。直接比较二进制数据是非常缓慢的且计算量巨大,但是哈希函数在设计上非常快。给定两个大小为几 M 或者几 G 的文件,你可以事先生成它们的哈希值,然后在需要的时候再进行比较。

通常,对哈希值进行签名比对大型数据集本身进行签名更容易。这个特性太重要了,以至于密码学中对哈希值最常见的应用就是生成“数字”签名。

由于生成数据的哈希值很容易,所以通常不需要有两套数据。假设你想在你的电脑上运行一个可执行文件。但是在你运行之前,你需要检查这个文件就是你要的文件,没有被黑客篡改。你可以方便快捷的对文件生成哈希值,只要你有一个这个哈希值的副本,你就可以相当肯定这就是你想要的文件。

下面是一个简单的例子:

$ shasum -a256 ~/bin/fop
87227baf4e1e78f6499e4905e8640c1f36720ae5f2bd167de325fd0d4ebc791c  /home/bob/bin/fop

如果我知道 fop 这个可执行文件的 SHA-256 校验和,这是由供应商(这个例子中是 Apache 基金会)提供的:

87227baf4e1e78f6499e4905e8640c1f36720ae5f2bd167de325fd0d4ebc791c

然后我就可以确信,我驱动器上的这个可执行文件和 Apache 基金会网站上发布的文件是一模一样的。这就是哈希函数难以发生碰撞(或者至少是 很难通过计算得到碰撞)这个性质的重要之处。如果黑客能将真实文件用哈希值相同的文件轻易的进行替换,那么这个验证过程就毫无用处。

事实上,这些性质还有更技术性的名称,我上面所描述的将三个重要的属性混在了一起。更准确地说,这些技术名称是:

  1. 抗原像性 pre-image resistance :给定一个哈希值,即使知道用了什么哈希函数,也很难得到用于创建它的消息。
  2. 抗次原像性 second pre-image resistance :给定一个消息,很难找到另一个消息,使得这个消息可以产生相同的哈希值。
  3. 抗碰撞性 collision resistance :很难得到任意两个可以产生相同哈希值的消息。

抗碰撞性抗次原像性 也许听上去是同样的性质,但它们具有细微而显著的不同。抗次原像性 说的是如果 已经 有了一个消息,你也很难得到另一个与之哈希值相匹配的消息。抗碰撞性 使你很难找到两个可以生成相同哈希值的消息,并且要在哈希函数中实现这一性质则更加困难。

让我回到黑客试图替换文件(可以通过哈希值进行校验)的场景。现在,要在“外面”使用加密哈希算法(除了使用那些在现实世界中由独角兽公司开发的完全无 Bug 且安全的实现之外),还有一些重要且困难的附加条件需要满足。认真的读者可能已经想到了其中一些,特别需要指出的是:

  1. 你必须确保自己所拥有的哈希值副本也没有被篡改。
  2. 你必须确保执行哈希算法的实体能够正确执行并报告了结果。
  3. 你必须确保对比两个哈希值的实体确实报告了这个对比的正确结果。

确保你能满足这些条件绝对不是一件容易的事。这就是 可信平台模块 Trusted Platform Modules (TPM)成为许多计算系统一部分的原因之一。它们扮演着信任的硬件基础,可以为验证重要二进制数据真实性的加密工具提供保证。TPM 对于现实中的系统来说是有用且重要的工具,我也打算将来写一篇关于 TPM 的文章。


via: https://opensource.com/article/20/7/hash-functions

作者:Mike Bursell 选题:lujun9972 译者:Yufei-Yan 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

美国官方在开会讨论端到端加密。

禁止解禁华为之后,美国总统唐纳德特朗普现在将目光盯上了端到端加密,据一份新的报告声称,白宫高级官员本周会面讨论了政府可以在这方面采取的第一项动作。

Politico 援引了三位知情人士的话指出,来自几个关键机构的二号官员讨论了针对端到端加密的潜在攻击。

“这两条路径是,要么就加密问题发表声明或一般立场,并且[说]他们将继续致力于解决方案,或者要求国会立法,”Politico 援引一位消息人士的话说。

虽然美国政府希望终止美国公司开发的软件中的端到端加密功能,但这一提议却招致了美国各机构代表的不同反应。

Politico 指出,例如,国土安全部 “内部存在分歧”,因为该机构意识到禁止端到端加密可能产生的安全隐患。

加密争议

推动制定这项针对端到端加密的规定,被视为美国情报机构和执法部门努力获取属于犯罪分子和恐怖分子的设备和数据的决定性步骤。

大多数美国公司已经将加密捆绑到他们的产品当中,这包括苹果和谷歌,它阻止了调查人员访问嫌疑人的数据。科技公司将端到端加密定位为一项关键的隐私功能,其中一些人警告说,任何针对它的监管都可能影响到国家安全。

特别是苹果公司,它是反对加密监管的最大公司之一。该公司拒绝解锁圣贝纳迪诺恐怖分子使用的 iPhone,解释说侵入该设备会损害所有客户的安全。

FBI 最终使用了第三方开发的软件解锁了该设备。


via: https://news.softpedia.com/news/donald-trump-now-wants-to-ban-end-to-end-encryption-526567.shtml

作者:Bogdan Popa 选题:lujun9972 译者:wxy 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出