工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Industrial Internet of Things >> モノのインターネットテクノロジー

Linuxでのデータ整合性チェックにデジタル署名を使用する

はじめに

今日の世界で最も重要な質問の1つは、受信したデータの信頼性の問題です。たとえば、ユーザーАはデータDをユーザーBに電子メールで送信します。ユーザーBは、受信したデータがユーザーAによって送信されたデータと同じであることをどのように確認できますか?この問題を解決する1つの可能な方法は、デジタル署名(DS)を使用することです。 DSには次の要件が適用されます。

この記事では、Linux(64ビットELF)でのバイナリファイルの整合性チェックのDS実装例について検討します。送信者と受信者のみが通信している場合(サードパーティ/アービトレーターなし)、ダイレクトDSを使用します。このためには、秘密暗号化キーと公開キー(証明書)が必要になります。送信者は両方のキーを作成します。ユーザーAは実行可能ファイルに署名し、安全な配信手段を使用して証明書をユーザーBに渡します。この後、ユーザーAは署名されたファイルをユーザーBに送信します。ユーザーBは受信したファイルを実行します。バイナリファイルが破損している場合、ユーザーBはDS検証が失敗したというメッセージを受け取ります。このソリューションを実装するには、バイナリファイルに署名するためのプログラムとDSを検証するコードが必要です。

DSの実装例

DSの実装には、次の手順が含まれます。

  1. MD5ソースバイナリファイルの生成;

  2. 2つのキーの作成:プライベートとパブリック(証明書)。

  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 =Nizhni Novgorod / L =Nizhniy Novgorod / O =Auriga / OU =DEV / CN =www.auriga.com "007 008 if [" $# "=" 0 "]; then009 echo "使用法:sign_elfs.sh ..." 010 exit 1; 011 fi012 013 if [! -d "$ KEY_DIR"]; then014#$ DIRECTORYが存在しない場合、制御はここに入ります。015mkdir "$ 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 for ELF_BIN in $ @; 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" 026 027 if [! -f "$ ELF_BIN"] || ["x $ ELF_BIN" ="x"]; then028 echo "エラー:そのようなファイルはありません$ ELF_BIN" 029 exit 1030 fi031 032#.sigsection033を削除しますobjcopy--remove-section =.sig "$ ELF_BIN" 034035#追加ゼロで埋められた512バイトのセクション036rm -fダミー.txt037タッチdummy.txt038切り捨て--size =512ダミー.txt039objcopy --add-section .sig =dummy.txt --set-section-flags .sig =noload、読み取り専用 "$ ELF_BIN" 040 041#MD5ハッシュを作成042 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" "$ KEY_DIR / $ ELF_BIN_MD5" 046 047#certificate048を使用して暗号化されたMD5ハッシュを検証openssl dgst -sha256 -verify <(openssl x509 -in "$ CERTIFICATE" -pubkey -noout)-signature "$ KEY_DIR / $ ELF_BIN_SIGNATURE" "$ KEY_DIR / $ ELF_BIN_MD5" 049 050#追加暗号化されたMD5ハッシュをELFバイナリに.sigsection051 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#Print .sig section055 echo" Check .sig section "056 objdump -sj .sig" $ ELF_BIN "057 done058 059 rm -f dumpy.txt060 061 ls -ls〜 / .ssh 


図1.ELFバイナリに署名するプロセス。 (出典:Auriga)

このスクリプトの機能の詳細を調べてみましょう。

19行目:

openssl req -nodes -x509 -sha256 -newkey rsa:4096 -keyout "$ PRIVATE_KEY" -out "$ CERTIFICATE" -days 365 -subj "$ SUBJECT"

req —証明書作成リクエスト

-ノード—秘密のプレーンテキストキーを作成します

-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が生成されます。秘密鍵はデータの暗号化に使用され、証明書はデータの復号化に使用されます。 1つの秘密鍵を使用して、この秘密鍵で暗号化されたデータを復号化するための多数の一意の証明書を生成することができます。

21行目:

;行う

sign_elf.shスクリプトに追加されたすべてのバイナリファイルのループの開始。

33行目:

objcopy –remove-section =.sig“ $ ELF_BIN”

.sig を削除します バイナリファイルのセクション。これは、ファイルがすでにスクリプトで署名されていて、再署名したい場合に実行する必要があります。

36行目以降:

rm -fダミー.txt
touchdummy.txt
truncate –size =512dummy.txt
objcopy –add-section .sig =dummy.txt –set -section-flags .sig =noload、readonly“ $ ELF_BIN

512バイトのテキストファイルを作成し、ランタイム .sig にロードされていないバイナリファイルに追加します 読み取り専用のセクションで、dummy.txtファイルのデータが含まれています。

42行目:

md5sum“ $ ELF_BIN” | awk '{print $ 1}'>“ $ KEY_DIR / $ ELF_BIN_MD5”

バイナリファイルのMD5を計算します( .sig を使用) セクション)、結果をテキストファイルbinary_name.md5に書き込みます。

45行目:

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行目:

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行目:

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. IoTを使用してAIの準備をする方法
  3. デジタルツインは、製造業におけるIoTのインテリジェントエッジになる可能性があります–パート2
  4. デジタル世界でのメンテナンス
  5. システムはIoTの準備ができていますか?
  6. デジタル保険:保険業界を形作る5つのデジタルトレンド
  7. WesternDigitalがIIoT向けの新しい3DNAND製品を発表
  8. WesternDigitalがIIoT向けの新しい3DNAND製品を発表
  9. IoTデータの保存にクラウドコンピューティングを使用する利点
  10. インダストリー4.0テクノロジー:デジタル戦略を開発するためのヒント
  11. より高速なX線イメージングのためのニューラルネットワークの使用