亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Industrial Internet of Things >> 物联网技术

在 Linux 中使用数字签名进行数据完整性检查

简介

当今世界最重要的问题之一是对接收数据的信心问题。例如,用户 А 通过电子邮件将数据 D 发送给用户 B。用户 B 如何确定接收到的数据与用户 A 发送的数据相同?解决此问题的一种可能方法是使用数字签名 (DS)。以下要求适用于 DS:

本文考虑在 Linux(64 位 ELF)中进行二进制文件完整性检查的 DS 实现示例。当只有发件人和收件人进行通信时(没有第三方/仲裁员),我们将使用直接 DS。为此,我们需要一个私有加密密钥和一个公共密钥(证书)。发件人创建两个密钥。用户A对可执行文件进行签名,并通过安全传递方式将证书传递给用户B。之后,用户 A 向用户 B 发送一个签名文件。用户 B 运行接收到的文件;如果二进制文件损坏,用户 B 将收到 DS 验证失败的消息。为了实现这个解决方案,我们需要一个用于签署二进制文件的程序和一个验证 DSs 的代码。

DS 实现示例

DS 实施包括以下步骤:

  1. MD5 源二进制文件生成;

  2. 创建两个密钥:private 和 public(证书)。

  3. 二进制文件签名(ELF):
    1 二进制文件的 MD5 在私钥的帮助下加密;
    3.2 加密后的MD5写入新的.sig 二进制文件部分;
    3.3 证书保存到~/.ssh文件夹。

所有这些都可以在 Linux 实用程序 openssl、objcopy 和 md5sum 的帮助下实现。您可以在下面找到对 ELF 二进制文件进行签名的脚本 sign_elf.sh 示例。 (注意:本文末尾包含没有行号的源代码。)

001 #!/bin/bash002 003 KEY_DIR="$HOME/.ssh"004 PRIVATE_KEY="$KEY_DIR/priv.key"005 CERTIFICATE="$KEY_DIR/pub.crt"006 SUBJECT="/C=RU /ST=下诺夫哥罗德/L=下诺夫哥罗德/O=Auriga/OU=DEV/CN=www.auriga.com"007 008 if [ "$#" ="0" ]; then009 echo "Usage:sign_elfs.sh ... "010 exit 1;011 fi012 013 if [ ! -d "$KEY_DIR" ]; then014 # 如果$DIRECTORY 不存在,控件会进入这里。015 mkdir "$KEY_DIR"016 fi017 018 # 创建私钥和证书019 openssl req -nodes -x509 -sha256 -newkey rsa:4096 -keyout "$PRIVATE_KEY" -out " $CERTIFICATE" -days 365 -subj "$SUBJECT"020 021 对于 $@ 中的 ELF_BIN; do022 ELF_BASE_NAME="${ELF_BIN##*/}"023 # ELF_BIN_OLD="$ELF_BIN.old"024 ELF_BIN_SIGNATURE="$ELF_BASE_NAME.sha256"025 ELF_BIN_MD5="$ELF_BASE_NAME.md5"02702 -f "$ELF_BIN" ] || [ "x$ELF_BIN" ="x" ];then028 echo "Error:no such file $ELF_BIN"029 exit 1030 fi031 032 # 删除 .sig section033 objcopy --remove-section=.sig "$ELF_BIN"034 035 # 添加512 字节的部分填充了 zeros036 rm -f dummy.txt037 touch dummy.txt038 truncate --size=512 dummy.txt039 objcopy --add-section .sig=dummy.txt --set-section-flags .sig=noload, readonly "$ELF_BIN"040 041 # 创建 MD5 hash042 md5sum "$ELF_BIN" | awk '{ print $1 }'> "$KEY_DIR/$ELF_BIN_MD5"043 044 # 使用私钥加密 MD5 哈希045 openssl dgst -sha256 -sign "$PRIVATE_KEY" -out "$KEY_DIR/$ELF_BIN_SIGNATURE" "$ELF_BIN_DIR/ 046 047 # 使用证书验证加密的 MD5 哈希值将加密的 MD5 哈希转换为 ELF 二进制文件到 .sig section051 echo "Add .sig section"052 objcopy --update-section .sig="$KEY_DIR/$ELF_BIN_SIGNATURE" --set-section-flags .sig=noload,readonly "$ELF_BIN " "$ELF_BIN"053 054 # 打印 .sig section055 echo "Check .sig section"056 objdump -sj .sig "$ELF_BIN"057 done058 059 rm -f dummy.txt060 061 ls -ls ~/.ssh


图 1. 签署 ELF 二进制文件的过程。 (来源:御夫座)

让我们探索一下这个脚本的细节。

第 19 行:

<字体样式="字体大小:13px;" face="Courier New"> openssl req -nodes -x509 -sha256 -newkey rsa:4096 -keyout “$PRIVATE_KEY” -out “$CERTIFICATE” -days 365 -subj “$SUBJECT”

req — 证书创建请求

-nodes — 创建私有明文密钥

-x509 — 输出 — 自签名证书

-sha256 — 加密算法

-newkey rsa:4096 — 创建新证书和 RSA 私钥,位数 — 4096

-keyout $PRIVATE_KEY — 写入私钥的文件的路径

-out $CERTIFICATE — 写入证书的文件的路径 - 天 365 — 证书确认的天数

-subj $SUBJECT — 新的证书主题(格式应为 /type0=value0/type1=value1/type2=...)。在我们的例子中,这是 /C=RU/ST=Nizhni Novgorod/L=Nizhniy Novgorod/O=Auriga/OU=DEV/CN=www.auriga.com,其中
С — 国家
ST — 州、地区、省
L — 位置
O — 组织
OU — 组织部门/单位
CN — 基本标题/容器名称

该主题在 RFC-5280 (https://tools.ietf.org/html/rfc5280) 中有详细描述。运行此命令后,会生成一个私钥~/.ssh/priv.key 和证书~/.ssh/pub.crt。私钥将用于加密数据,证书将用于数据解密。使用一个私钥,可以生成多个唯一的证书,用于解密用这个私钥加密的数据。

第 21 行:

<字体样式="字体大小:13px;" face ="Courier New"> 用于 $@ 中的 ELF_BIN;做

添加到 sign_elf.sh 脚本的所有二进制文件的循环开始。

第 33 行:

<字体样式="字体大小:13px;" face ="Courier New"> objcopy –remove-section=.sig “$ELF_BIN”

删除 .sig 我们的二进制文件中的部分。如果文件已经用我们的脚本签名并且我们想要重新签名,则需要执行此操作。

第 36 行+:

<字体样式="字体大小:13px;" face="Courier New"> rm -f dummy.txt
touch dummy.txt
truncate –size=512 dummy.txt
objcopy –add-section .sig=dummy.txt –set -section-flags .sig=noload,readonly “$ELF_BIN

创建一个 512 字节的文本文件并将其添加到我们的二进制文件中,该文件未在运行时加载 .sig 仅用于读取的部分,其中包含来自 dummy.txt 文件的数据。

第 42 行:

<字体样式="字体大小:13px;" face="Courier New"> md5sum “$ELF_BIN” | awk '{ print $1 }'> “$KEY_DIR/$ELF_BIN_MD5”

计算二进制文件的MD5(用.sig 部分)并将结果写入文本文件 binary_name.md5。

第 45 行:

<字体样式="字体大小:13px;" face="Courier New"> openssl dgst -sha256 -sign “$PRIVATE_KEY” -out “$KEY_DIR/$ELF_BIN_SIGNATURE” “$KEY_DIR/$ELF_BIN_MD5”

此命令使用私钥对第 42 行创建的 MD5 文件进行加密。参数:

dgst — 这个选项表示我们要加密(签名)数据;

-sha256——加密算法;

-sign $PRIVATE_KEY — 使用私钥 $PRIVATE_KEY 加密文件;

-out $KEY_DIR/$ELF_BIN_SIGNATURE — 加密数据保存到文件 $KEY_DIR/$ELF_BIN_SIGNATURE;

$KEY_DIR/$ELF_BIN_MD5 — 包含要加密数据的文本文件。

第 48 行:

<字体样式="字体大小:13px;" face="Courier New"> openssl dgst -sha256 -verify <(openssl x509 -in "$CERTIFICATE" -pubkey -noout) -signature "$KEY_DIR/$ELF_BIN_SIGNATURE" "$KEY_DIR/$ELF_BIN_MD5"

签名文件验证。参考这行可以理解,对于DS验证,我们需要加密数据,一个可以帮助我们进行验证和数据验证的证书。也就是说,如果

x — 加密数据,
y — 证书,
z — 验证数据,

那么

f(x,y) =z

第 52 行:

<字体样式="字体大小:13px;" face="Courier New"> objcopy –update-section .sig=”$KEY_DIR/$ELF_BIN_SIGNATURE” –set-section-flags .sig=noload,readonly “$ELF_BIN” “$ELF_BIN”

删除旧的 .sig 部分并将一个新的添加到文件 $ELF_BIN (binary_name)。作为新 .sig 的数据 部分,使用来自签名文件 $KEY_DIR/$ELF_BIN_SIGNATURE (~/.ssh/binary_name.sha256) 的数据。


物联网技术

  1. 将为用户反馈工作!
  2. 为关联公司利用协同效应
  3. 如何为使用 IoT 的 AI 做好准备
  4. 数字孪生可以成为制造业物联网的智能边缘 - 第 2 部分
  5. 数字世界中的维护
  6. 您的系统准备好迎接物联网了吗?
  7. 数字保险:塑造保险业的 5 大数字趋势
  8. Western Digital 推出适用于 IIoT 的新 3D NAND 产品
  9. Western Digital 推出适用于 IIoT 的新 3D NAND 产品
  10. 使用云计算存储物联网数据的好处
  11. 工业 4.0 技术:制定数字战略的技巧
  12. 使用神经网络进行更快的 X 射线成像