$ 3硬件加密密钥-这可能吗?


最终的结果是形成了一个USB闪存驱动器大小的密钥,

广泛的加密以及大量的密钥使您可以考虑使用它们的可靠存储。长期以来,将密钥存储在无法复制的外部设备上一直是一种好习惯。我将讨论如何用3美元和2个小时制造这样的设备。

图片是什么意思?
. . : « — , … , ...». , , )

简要介绍工作原理


密码术使我们有机会隐藏我们想要发送的内容,以确保我们与思考的对象以及其他许多有趣的事物进行交流。通常,为了使所有这些正常工作,他们只要求我们做一件事- 将我们的加密密钥保密听起来很简单,不是吗?好吧,让我们看看如何隐藏密钥:

  • 保存到桌面上的文件是多年以来久经考验的古老记录方式。问题是,除了用户本人以外,还有许多其他程序可以访问您桌面上的文件。而且,如果您完全确定它们都能满足预期目的,请不要收集有关您的任何数据,也不要将它们合并到网络中-本文不适合您。
  • — - , . , , , - -
  • — , . , . , . , ( ssh-) .

如您所见,主要问题是密钥要么直接存储在计算机上,要么使用键盘,闪存驱动器等在计算机上输入。但是,您反对,如果我的计算机不知道密钥,那么我将如何加密数据?正确的答案是不可能的。该解决方案早已被发明。主要思想是将特殊设备连接到计算机,该设备本身将对数据进行加密。并且计算机将仅发送数据并接收结果。因此,例如,许多智能卡都可以工作。



所需组件


因此,让我们开始吧。我们将在便宜且相当流行的STM32系列微控制器上组装设备。当然,您可以自己制作印刷电路板但是我们要在2个小时内进行管理?因此,让我们采用现成的解决方案-ST-Link v2编程器。该设备看起来像这样。



奇怪的是,用于STM32微控制器的编程器已组装在STM32微控制器上。该设备看起来非常像闪存驱动器,这正是我们所能做的。此外,它的主体是铝制的,因此您不必担心会被损坏。速卖通1.5至3美元的售价奇迹。我们将需要其中两个。我们将在交钥匙的基础上翻新一个固件,然后使用第二个固件将固件上传到第一个固件。如果您已经有STM32编程器,则可以做一件事。

总计,我们需要:

  • 程序员ST-Link v2-2件
  • 烙铁
  • 电线很少-ST-Link通常已经包含合适的电线
  • Linux,以编译和上传固件

编译固件


因此,让我们从软件部分开始-为我们的密钥组装固件。固件源代码可以在此存储库中找到我建议下载最新的稳定版本(您可以在“标签”标签中找到它)。您可以克隆存储库或下载为zip存档。揉手指,启动终端,然后转到项目文件夹。转到src文件夹

$ cd src

为了编译和下载固件,我们需要安装几个软件包:

  • 无臂eabi-gcc
  • 无臂eabi-newlib
  • openocd

我使用pacman软件包管理器,就我而言,它看起来像这样


$ sudo pacman -S arm-none-eabi-gcc
$ sudo pacman -S arm-none-eabi-newlib
$ sudo pacman -S openocd

如果您坐在Ubuntu上,请使用apt。

让我提醒您,我们在项目的src文件夹中。
运行配置脚本

$ ./configure --vidpid=234b:0000

我们运行make实用程序,并观察如何编译固件。

$ make

编译后,将显示build文件夹,并在其中显示gnuk.elf文件-我们需要它。

将固件下载到设备


现在我们已经完成了固件文件,我们只需要将其下载到设备即可。为此,我们必须使用烙铁进行一些工作。不用担心,您不需要任何特殊技能,只需焊接4根导线即可。

因此,我们选择了一名程序员,并从中拿出了案子。选定的程序员将成为我们的捐助者。这是我们在内部找到的东西,请



注意板上的4个引脚。我们将需要焊接到他们。我建议为此使用ST-Link随附的电线。我们从一端清洁电线,然后将其焊接到触点。如果幸运的话,董事会上将有这些联系的迹象。



现在,我们将导线的第二端连接到其余的整个编程器。如果幸运的话,只需按照铭文连接导线:

GND至GND
3.3V至3.3V
SWDIO至SWDIO
SWCLK至SWCLK

如果板上没有标签,则必须随机戳一下才能使用测试仪。使用它,您可以轻松找到GND(在施主编程器的端子处连接到GND),类似于3.3V。其余两根电线将必须随机连接。幸运的是,只有两个选项,因此,我们得到了类似的结果。



在这张照片中,蓝色设备是程序员,我们仅将其用作程序员不要对本文开头的照片中的最终设备具有蓝色的机身颜色感到困惑。不是他 将来的设备在右侧。

下载固件


我们距离成功仅一步之遥,仅下载固件就可以了。打开终端,转到带有我们的固件(gnuk.elf)的文件夹。

运行命令:

$ openocd -f interface/stlink-v2.cfg -f target/stm32f1x.cfg -c 'program build/gnuk.elf verify reset exit'

因此,现在我们已将固件上传到我们的设备。仅剩一个步骤-禁止读取微控制器的内存。注意!这是非常重要的阶段,不允许窃取您密钥的人从中提取秘密信息。

为此,请运行以下命令:

openocd -f interface/stlink-v2.cfg -f target/stm32f1x.cfg -c init -c "reset halt" -c "stm32f1x lock 0" -c reset -c exit   

现在一切就绪。

全部放回去


现在所有步骤都落后了,仍然需要照顾我们设备的外观。我们焊接电线。我们也不再需要原始的接触条,因此您可以安全地将其拆焊。



断开安装座并一次焊接一个触点。



现在我们放回箱子,并用一块合适的塑料密封后壁。

我该如何使用


我们组装的是一个OpenPGP智能卡仿真器这样的卡可以存储GPG,SSH密钥。范围很大,例如:


如您所见,您可以做很多有趣和有用的事情。

ssh的用法示例


最后,让我们看看如何使用此密钥存储ssh密钥并连接到远程服务器。

有两种方法-生成新密钥或将现有密钥导入令牌。

让我们看看两个选项。将令牌插入USB。在dmesg中,您可以查看有关已连接设备的信息。


$ dmesg
[11073.599862] usb 1-3: USB disconnect, device number 11
[11311.647551] usb 1-3: new full-speed USB device number 12 using xhci_hcd
[11311.796881] usb 1-3: New USB device found, idVendor=234b, idProduct=0000, bcdDevice= 2.00
[11311.796884] usb 1-3: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[11311.796885] usb 1-3: Product: Gnuk Token
[11311.796887] usb 1-3: Manufacturer: Free Software Initiative of Japan

新的SSH密钥生成


重要的是要了解密钥是在设备本身而不是在计算机上生成的。因此,这样的密钥根本不会离开设备。

前往gpg:


$ gpg --card-edit

gpg交互模式打开,使用admin命令启用管理模式:


gpg/card> admin

接下来,运行新的密钥生成命令:


gpg/card> generate

以下是标准gpg密钥生成过程。在此期间,系统将要求您将备份密钥保存到磁盘。开发人员建议进行备份,但您可以决定。
唯一的问题是,支持硬件生成最高2048位的RSA密钥。如果需要4096,则必须在计算机上生成密钥,然后将其导入设备本身。
接下来,您将需要输入密码。默认情况下,以下PIN码在固件中受保护:

CARD PIN-123456
ADMIN PIN-12345678

将来必须更改它们

密钥的生成时间比直接在计算机上生成的时间长一点,因此我们有耐心。

导入现有密钥


现在,让我们看看如果您已经拥有要使用的ssh密钥,该怎么办。
为此,将密钥导入gpg:


$ pem2openpgp temporary_id < id_rsa  | gpg --import

现在我们需要找出密钥的ID。为此,请列出gpg中所有可用的内容:


$ gpg -K

我们找到了导入的密钥:


sec>  rsa2048 2020-02-05 [C]
      DFEFF02E226560B7F5A5F2CAB19534F88F8FE4EC
      Card serial no. = FFFE 87144751
uid           [ unknown] temporary_id


在我的情况下,密钥ID为DFEFF02E226560B7F5A5F2CAB19534F88F8FE4EC

进入交互模式以编辑gpg密钥:


$ gpg --edit-key DFEFF02E226560B7F5A5F2CAB19534F88F8FE4EC

然后我们给出将密钥复制到智能卡的命令:


gpg> keytocard

一切都记录下来了。

以ssh格式导出公钥


我们从令牌中获取所需的公钥,以便将其放入服务器中:

$ pkcs15-tool --list-keys

就我而言,输出如下所示:


Using reader with a card: Free Software Initiative of Japan Gnuk (FSIJ-1.2.15-87144751) 00 00
Private RSA Key [Signature key]
	Object Flags   : [0x03], private, modifiable
	Usage          : [0x20C], sign, signRecover, nonRepudiation
	Access Flags   : [0x1D], sensitive, alwaysSensitive, neverExtract, local
	ModLength      : 2048
	Key ref        : 0 (0x00)
	Native         : yes
	Auth ID        : 01
	ID             : 01
	MD:guid        : f3de5f55-d100-4973-d572-40d67e20f033

在这里,我们对密钥的ID密钥(在我的情况下为01)感兴趣。现在,我们导出公共密钥:


$ pkcs15-tool --read-public-key 01

将公共密钥复制到pub.key文件中:


-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyzHQIWEApliWYaf0T8jb
Vh2nc5+LklKXeuJFTN3BW2VqdrTw1rpKXiANWpi+qbtZhZ2nP3CJX6qoGobXyCOd
/iAiygFlyW4BwTQpnAm81IE9lPzfasOK7SBuKJ+ZbB4WpuYJRozgtt/gpWzmnWnW
84/CU9Lqbhz95v/C/DImSf6LiwVdmiEj4CUNInl5pY4trguDsSfkw1u8gGqSPEsD
ZXtlVRx8iBGi0JR02g9KTL4dDGocUtcTK8W0eY+BDbQSXfTGCy93v8sEyhdQjHs8
oDiwkvFQ86gYqwL5DJ7U/rFSO3A5X6zmkFFV8nJZjxB2qfE5aommtXxow4iPml3x
YwIDAQAB
-----END PUBLIC KEY-----

并将其转换为ssh-rsa格式:


$ ssh-keygen -f pub.key -i -mPKCS8 

原来,公钥采用所需的格式:


ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDLMdAhYQCmWJZhp/RPyNtWHadzn4uSUpd64kVM3cFbZWp2tPDWukpeIA1amL6pu1mFnac/cIlfqqgahtfII53+ICLKAWXJbgHBNCmcCbzUgT2U/N9qw4rtIG4on5lsHham5glGjOC23+ClbOadadbzj8JT0upuHP3m/8L8MiZJ/ouLBV2aISPgJQ0ieXmlji2uC4OxJ+TDW7yAapI8SwNle2VVHHyIEaLQlHTaD0pMvh0MahxS1xMrxbR5j4ENtBJd9MYLL3e/ywTKF1CMezygOLCS8VDzqBirAvkMntT+sVI7cDlfrOaQUVXyclmPEHap8Tlqiaa1fGjDiI+aXfFj

接下来是配置ssh以使用给定密钥登录的标准过程-您需要将该密钥添加到远程服务器上的〜/ .ssh / authorized_keys文件中。

SSH配置


现在,为了使用我们的令牌进入服务器,您需要使用-I开关调用ssh并将路径传递给令牌驱动程序。我们的令牌与标准驱动程序之一兼容,因此我们将使用它

$ ssh -I /usr/lib/opensc-pkcs11.so martin@remotehost

但是,使用配置文件(〜/ .ssh / config)会更方便,在其中
添加以下几行。

Host digitalOceanServer
        HostName 192.168.0.1
        User root
        PKCS11Provider /usr/lib/opensc-pkcs11.so

ssh调用现在更加容易:


$ ssh digitalOceanServer

如何更改标准密码


同样重要的一步是安装您自己的密码。首先,您需要了解使用了两种不同的密码:

  • PIN码-该代码用于智能卡的日常操作-加密某些东西,签名等。
  • 管理员密码-需要此密码才能更改/删除密钥并进行各种此类“管理员”操作
  • 重设密码-一种密码,可让您在三次不正确的尝试输入PIN码后解锁令牌。它的使用是可选的,因此由您决定

每个代码只有3次尝试。之后,令牌被阻止。

现在开始吧。为此,我们再次进入交互式GPG模式:


$ gpg --card-edit

并输入passwd命令:


gpg/card> passwd

将打开一个窗口,您可以在其中更改令牌中的密码。

现在,您需要更改管理员PIN。为此,请进入管理员模式:


gpg/card> admin

再次输入passwd命令:


gpg/card> passwd

但是,现在它可以在高级模式下工作,我们将提供几个选项:


1 - change PIN
2 - unblock PIN
3 - change Admin PIN
4 - set the Reset Code
Q - quit

Your selection?

我们选择更改管理员PIN,然后根据标准方案设置管理员密码。让我提醒您,默认的Admin PIN是12345678。

关于设备安全


当然,仅需3美元,您就无法获得200美元以上的密钥级安全性。但是,组装好的设备可以视为入门级钥匙。据我所知,Nitrokey Start工厂密钥使用相同的固件。在任何情况下,使用这种设备都会将安全性至少提高一个级别。因此,这是开始使用硬件密钥的好方法。

现在,让我们谈谈如果丢失此密钥会发生什么。密钥本身受密码保护。几次失败尝试后,密钥被锁定。设备本身的存储器受到保护,无法读取,因此无法直接读取写入其中的密钥。
芯片本身受到某些类型的攻击(例如,微电极的制备和连接,这将使您能够测量芯片中任何位置(包括存储器)的电压),但它们的成本很高。

因此,我再重复一次,这是一个很好的入门级选项,即使有了它,安全性也将达到一个全新的水平。

链接到有用的材料


在使用设备的过程中,肯定会需要其他信息。我整理了一份好资料清单。

  • Debian网站页面
  • 令牌文档
  • Nitrokey Start令牌手册 -使用相同的固件,因此这些提示也适用于我们

我们组装的设备是由开源项目GNUK(实际上称为令牌)开发的,因此应“ GNUK”的要求,可以在Google中找到更多信息。

更新。这些注释表明存在一些固件,可以使您使用该设备进行两步验证。可以在此处找到固件代码
。 2 02/15/2020评论表明,对于该特定芯片,存在一个漏洞,可能会耗尽内存的内容。据我了解,它尚未发布,但已经宣布。因此,到目前为止,一切还不清楚。他们还提出了一个好的解决方案-将环氧树脂倒入设备的机身中与铝粉混合。凯文·米特尼克(Kevin Mitnick)的书“欺骗的艺术”中介绍了这种方法。因此,为了接近芯片,有必要使胶水破裂,如果不小心处理,可能会永久损坏芯片。当然,可以绕开此方法,这甚至会增加黑客入侵的成本。当然,如果有必要,Mossad会制作Mossad的东西,这不会阻止他,而只会延迟它。
更新。 3PM收到许多消息,提示人们无法获得ST-Link固件。弄清楚之后,我们发现现在中国的制造商开始积极节省组件,并使用板载64Kb内存的芯片。对于固件而言,这还远远不够,请在板上寻找128Kb芯片。因此,我建议购买时检查安装的芯片(如果可能的话),或在评论中与卖方联系/。
更新。4事实证明,仍然可以使用带有64 KB芯片的中文程序员(尽管您必须使用最新的固件版本)- 有关此问题有趣文章出现在中心上

Source: https://habr.com/ru/post/undefined/


All Articles