最终的结果是形成了一个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至GND3.3V至3.3VSWDIO至SWDIOSWCLK至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-123456ADMIN 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芯片的中文程序员(尽管您必须使用最新的固件版本)- 有关此问题的有趣文章出现在中心上。