산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Industrial Internet of Things >> 사물 인터넷 기술

Linux에서 데이터 무결성 검사를 위해 디지털 서명 사용

소개

오늘날 세계에서 가장 중요한 질문 중 하나는 수신된 데이터의 신뢰도에 대한 질문입니다. 예를 들어, 사용자 А는 이메일을 통해 사용자 B에게 데이터 D를 보냅니다. 사용자 B는 수신된 데이터가 사용자 A가 보낸 데이터와 동일한지 어떻게 확인할 수 있습니까? 이 문제를 해결하는 한 가지 가능한 방법은 DS(디지털 서명)를 사용하는 것입니다. 다음 요구 사항이 DS에 적용됩니다.

이 기사는 Linux(64비트 ELF)에서 바이너리 파일 무결성 검사를 위한 DS 구현 예를 고려합니다. 발신자와 수신자만 통신할 때(제3자/중재인 없이) 직접 DS를 사용합니다. 이를 위해 개인 암호화 키와 공개 키(인증서)가 필요합니다. 발신자는 두 키를 모두 생성합니다. 사용자 A는 실행 파일에 서명하고 안전한 전달 수단을 통해 사용자 B에게 인증서를 전달합니다. 그런 다음 사용자 A는 서명된 파일을 사용자 B에게 보냅니다. 사용자 B는 수신된 파일을 실행합니다. 바이너리 파일이 손상된 경우 사용자 B는 DS 확인에 실패했다는 메시지를 받게 됩니다. 이 솔루션을 구현하려면 바이너리 파일 서명을 위한 프로그램과 DS를 확인하는 코드가 필요합니다.

DS 구현 예

DS 구현에는 다음 단계가 포함됩니다.

  1. MD5 소스 바이너리 파일 생성;

  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=니즈니 노브고로드/L=니즈니 노브고로드/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가 존재하지 않으면 제어가 여기에 입력됩니다.015 mkdir "$KEY_DIR"016 fi017 018 # 개인 키 및 인증서 생성019 openssl req -nodes -x509 -sha256 -newkey rsa:4096 -keyout "$PRIVATE_KEY" -out " $CERTIFICATE" -일 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"06 경우 -f "$ELF_BIN" ] || [ "x$ELF_BIN" ="x" ];then028 echo "오류:해당 파일 없음 $ELF_BIN"029 exit 1030 fi031 032 # .sig section033 제거 objcopy --remove-section=.sig "$ELF_BIN"034 035 # 추가 0으로 채워진 512바이트 섹션 036 rm -f dummy.txt037 touch dummy.txt038 truncate --size=512 dummy.txt039 objcopy --add-section .sig=dummy.txt --set-section-flags .sig=noload, 읽기 전용 "$ELF_BIN"040 041 # MD5 hash042 생성 md5sum "$ELF_BIN" | awk '{ print $1 }'> "$KEY_DIR/$ELF_BIN_MD5"043 044 # 개인 키를 사용하여 MD5 해시 암호화 openssl dgst -sha256 -sign "$PRIVATE_KEY" -out "$KEY_DIR/$ELF_BIN_SIGNATURE" "$5"_DIR 046 047 # 인증서를 사용하여 암호화된 MD5 해시를 확인합니다.048 openssl dgst -sha256 -verify <(openssl x509 -in "$CERTIFICATE" -pubkey -noout) -signature "$KEY_DIR/$ELF_BIN_SIGNATURE" "$KEY_DIR/$5"049 Add # 암호화된 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 ".sig 섹션 확인"056 objdump -sj .sig "$ELF_BIN"057 done058 059 rm -f dummy.txt060 061 ls -ls ~/.ssh


그림 1. ELF 바이너리 서명 과정. (출처:Auriga)

이 스크립트가 하는 일을 자세히 살펴보겠습니다.

19행:

<글꼴 스타일 ="글꼴 크기:13픽셀;" 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행:

<글꼴 스타일 ="글꼴 크기:13픽셀;" $@의 ELF_BIN에 대한 face ="Courier New">; 할

sign_elf.sh 스크립트에 추가된 모든 바이너리 파일의 루프 시작

33행:

<글꼴 스타일 ="글꼴 크기:13픽셀;" face ="Courier New"> objcopy –remove-section=.sig “$ELF_BIN”

.sig 삭제 바이너리 파일의 섹션. 파일이 이미 스크립트로 서명되어 있고 다시 서명하려는 경우 이 작업을 수행해야 합니다.

36행 이상:

<글꼴 스타일 ="글꼴 크기:13픽셀;" face ="Courier New"> rm -f dummy.txt
터치 dummy.txt
truncate –size=512 dummy.txt
objcopy –add-section .sig=dummy.txt –set -section-flags .sig=noload, 읽기 전용 “$ELF_BIN

512바이트 텍스트 파일을 만들고 런타임 .sig에 로드되지 않은 바이너리 파일에 추가합니다. dummy.txt 파일의 데이터가 포함된 읽기 전용 섹션입니다.

42행:

<글꼴 스타일 ="글꼴 크기:13픽셀;" face ="Courier New"> md5sum “$ELF_BIN” | awk '{ $1 인쇄 }'> “$KEY_DIR/$ELF_BIN_MD5”

바이너리 파일의 MD5 계산(.sig 포함) 섹션) 결과를 텍스트 파일 binary_name.md5에 씁니다.

45행:

<글꼴 스타일 ="글꼴 크기:13픽셀;" 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행:

<글꼴 스타일 ="글꼴 크기:13픽셀;" 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행:

<글꼴 스타일 ="글꼴 크기:13픽셀;" 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. IoT를 사용하여 AI를 준비하는 방법
  3. 디지털 트윈은 제조 부문에서 IoT를 위한 지능형 에지가 될 수 있습니다 – 2부
  4. 디지털 세계의 유지 관리
  5. 시스템이 IoT를 사용할 준비가 되었습니까?
  6. 디지털 보험:보험 산업을 형성하는 5가지 디지털 트렌드
  7. Western Digital, IIoT를 위한 새로운 3D NAND 제품 출시
  8. Western Digital, IIoT를 위한 새로운 3D NAND 제품 출시
  9. IoT 데이터 저장을 위한 클라우드 컴퓨팅 사용의 이점
  10. 인더스트리 4.0 기술:디지털 전략 개발을 위한 팁