오늘날 세계에서 가장 중요한 질문 중 하나는 수신된 데이터의 신뢰도에 대한 질문입니다. 예를 들어, 사용자 А는 이메일을 통해 사용자 B에게 데이터 D를 보냅니다. 사용자 B는 수신된 데이터가 사용자 A가 보낸 데이터와 동일한지 어떻게 확인할 수 있습니까? 이 문제를 해결하는 한 가지 가능한 방법은 DS(디지털 서명)를 사용하는 것입니다. 다음 요구 사항이 DS에 적용됩니다.
서명 내용은 서명된 메시지에 따라 달라야 합니다.
발신자의 고유 정보는 서명에 사용해야 합니다.
서명을 만들기 쉬워야 합니다.
서명을 계산적으로 위조하는 것은 불가능해야 합니다.
서명은 작아야 합니다.
이 기사는 Linux(64비트 ELF)에서 바이너리 파일 무결성 검사를 위한 DS 구현 예를 고려합니다. 발신자와 수신자만 통신할 때(제3자/중재인 없이) 직접 DS를 사용합니다. 이를 위해 개인 암호화 키와 공개 키(인증서)가 필요합니다. 발신자는 두 키를 모두 생성합니다. 사용자 A는 실행 파일에 서명하고 안전한 전달 수단을 통해 사용자 B에게 인증서를 전달합니다. 그런 다음 사용자 A는 서명된 파일을 사용자 B에게 보냅니다. 사용자 B는 수신된 파일을 실행합니다. 바이너리 파일이 손상된 경우 사용자 B는 DS 확인에 실패했다는 메시지를 받게 됩니다. 이 솔루션을 구현하려면 바이너리 파일 서명을 위한 프로그램과 DS를 확인하는 코드가 필요합니다.
DS 구현 예
DS 구현에는 다음 단계가 포함됩니다.
MD5 소스 바이너리 파일 생성;
개인 및 공개(인증서)의 두 가지 키 생성
이진 파일 서명(ELF): 1 이진 파일의 MD5는 개인 키를 사용하여 암호화됩니다. 3.2 암호화된 MD5가 새 .sig에 기록됩니다. 바이너리 파일 섹션; 3.3 인증서는 ~/.ssh 폴더에 저장됩니다.
이 모든 것은 Linux 유틸리티 openssl, objcopy 및 md5sum을 사용하여 구현할 수 있습니다. 아래에서 ELF 바이너리 파일에 서명하는 스크립트 sign_elf.sh의 예를 찾을 수 있습니다. (참고:행 번호가 없는 소스는 이 기사의 끝에 포함되어 있습니다.)
-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 삭제 바이너리 파일의 섹션. 파일이 이미 스크립트로 서명되어 있고 다시 서명하려는 경우 이 작업을 수행해야 합니다.
이전 .sig 제거 섹션을 열고 $ELF_BIN(binary_name) 파일에 새 항목을 추가합니다. 새로운 .sig에 대한 데이터로 섹션에서 서명된 파일 $KEY_DIR/$ELF_BIN_SIGNATURE(~/.ssh/binary_name.sha256)의 데이터가 사용됩니다.