기본 콘텐츠로 건너뛰기

추천 가젯

OpenSSL 명령어로 비대칭 암호화하기 (공개키로 암호화하고 비밀키로 복호화하기)

비대칭 암호화 암호화 키와 복호화 키가 서로 다른 비대칭 암호의 특징을 이용하여 공개키로 암호화하고 비밀키로 복호화할 수 있다. 우선 이전에 생성한 private.pem 과 public.pem 이 필요하다. 비밀키는 계속 가지고 있고, 통신을 하고자 하는 사람에게 공개키를 전달한다. 그 다음 공개키를 가진 사람이 공개키로 암호화하고, 암호화한 결과를 전달한다. 이 과정은 도청되어도 비밀키를 알아낼 수 없기에 원문을 도청자가 알아낼 수 없다. 원문 준비하기 원본은 다음과 같이 준비한다. 주로 대칭 암호화를 사용할 키를 전달할 때 공개키 암호를 보조하여 사용하므로, 여기서는 키파일을 생성하겠다. echo -n "key=" > key.txt openssl rand -hex 32 >> key.txt echo -n "iv=" >> key.txt openssl rand -hex 16 >> key.txt 그러면 key와 iv가 포함된 파일이 완성된다. 이 파일을 안전하게 전달하기 위해 암호화한다. 공개키로 암호화하기 openssl pkeyutl -encrypt -pubin -inkey [public.pem] -in [key.txt] -out encrypted.bin openssl pkeyutl : openssl에서 제공하는 low-level 공개키/개인키 연산 유틸리티인 pkeyutl 을 이용한다. -encyprt : 암호화를 한다. -pubin : 입력받을 키의 종류를 공개키로 지정한다. -inkey [입력키] : 입력받을 키를 지정한다. 암호화를 할 때는 공개키를 지정한다. 필자는 'public.pem'으로 지정하였다. -in [입력파일] : 입력파일을 지정한다. 암호화를 할 때는 원문을 지정한다. 필자는 위에서 생성한 'key.txt'로 지정하였다. -out [출력파일] : 출력파일을 지정한다. 출력된 결과는 암호문이므로 저장될 이름을 지정한다. 필자는 'e...

Git과 CLI (6) - 3-way 병합하기

버그 처리 시나리오

버그를 마주하였다면 다음 단계를 거쳐 수정하게 된다.

  1. (옵션) 오류가 없는 버전(주로 Tag가 있는 버전)으로 롤백

  2. master 브랜치로부터 hotfix 브랜치 생성

  3. 빠르게 소스 코드 수정 및 테스트

  4. master 브랜치로 병합(Fast-Forward) 및 배포

  5. 개발 중인 브랜치에도 병합

버그가 발생한 상황에서는 원래 작업 중이던 브랜치도 master 브랜치로부터 시작했기 때문에 같은 버그를 가지고 있을 것이다. 그렇기 때문에 hotfix 브랜치의 내용은 master 브랜치와 개발 브랜치 모두에 병합되어야 한다. 보통 master 브랜치의 병합은 빨리감기이기 때문에 쉽게 되는 반면 개발 중인 브랜치의 병합은 병합 커밋이 생성되고 충돌이 일어날 가능성이 높다.


먼저 feature1 브랜치를 만들고 커밋을 생성해 보겠다.

# master로 체크아웃
yegang@yegangs:~/hello-git-cli$ git checkout master
Already on 'master'
Your branch is up to date with 'origin/master'.

# feature1 브랜치 생성 후 체크아웃
yegang@yegangs:~/hello-git-cli$ git checkout -b feature1
Switched to a new branch 'feature1'

# 새 내용 추가
yegang@yegangs:~/hello-git-cli$ echo "기능 1 추가" >> file1.txt

# 스테이징 및 커밋 추가
yegang@yegangs:~/hello-git-cli$ git add file1.txt
yegang@yegangs:~/hello-git-cli$ git commit -m "새로운 기능 1 추가"
[feature1 247cb34] 새로운 기능 1 추가
 1 file changed, 1 insertion(+)
# 

이 시점에서 장애가 발생했다고 가정하자. 커밋을 한 상태에서 장애가 발생했지만 실제 개발을 진행할 때에는 커밋을 하기 애매한 상황에서 장애가 발생할 수 있다. 이 때 git stash를 사용할 수 있다. 우선 커밋을 한 직후에 장애가 발생했다고 가정하고 서술한다.

이제 버그를 고치기 위해 master 브랜치에서 hotfix 브랜치를 먼저 만들어야 한다. 그리고 버그를 고친 후에 커밋을 한다. 그리고 hotfix 브랜치를 master 브랜치로 병합한다.

master 브랜치의 최신 커밋을 기반으로 hotfix 브랜치 작업을 했기 때문에 빨리 감기 병합이 가능한 상황이다.

# master로부터 hotfix 브랜치 생성 및 체크아웃
yegang@yegangs:~/hello-git-cli$ git checkout -b hotfix master
Switched to a new branch 'hotfix'

# 로그 보기
yegang@yegangs:~/hello-git-cli$ git log --oneline --all -n2
247cb34 (feature1) 새로운 기능 1 추가
db8ebff (HEAD -> hotfix, tag: v0.1, origin/master, m
aster) mybranch1의 두 번째 커밋

# 핫픽스 내용을 입력 후 커밋
yegang@yegangs:~/hello-git-cli$ echo "핫픽스" >> file1.txt
yegang@yegangs:~/hello-git-cli$ git add file1.txt
yegang@yegangs:~/hello-git-cli$ git commit -m "hotfix 실습"
[hotfix ef34ef4] hotfix 실습
 1 file changed, 1 insertion(+)
 
# 커밋 내용 확인
yegang@yegangs:~/hello-git-cli$ git log --oneline -n1
ef34ef4 (HEAD -> hotfix) hotfix 실습

# master 브랜치로 체크아웃 후 hotfix 병합
yegang@yegangs:~/hello-git-cli$ git merge hotfix
Updating db8ebff..ef34ef4
Fast-forward
 file1.txt | 1 +
 1 file changed, 1 insertion(+)
 
# push
yegang@yegangs:~/hello-git-cli$ git push
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 4 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 312 bytes | 312.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
To https://github.com/yeganghwang/hello-git-cli.git
   db8ebff..ef34ef4  master -> master
yegang@yegangs:~/hello-git-cli$

hotfix 커밋의 내용은 버그 수정이었기 때문에 이 내용을 현재 개발중인 브랜치인 feature1에도 반영하여야 한다. 그런데 feature 브랜치와 master 브랜치는 서로 다른 분기로 진행되고 있다.

yegang@yegangs:~/hello-git-cli$ git log --oneline --graph --all
* ef34ef4 (HEAD -> master, origin/master, hotfix) hotfix
습
| * 247cb34 (feature1) 새로운 기능 1 추가
|/
* db8ebff (tag: v0.1) mybranch1의 두 번째 커밋

다른 가지로 빠졌기 때문에 빨리감기 병합은 불가능하므로 3-way 병합을 진행해야 한다.

3-way 병합을 한다고 해서 무조건 충돌이 발생하는 것은 아니지만, 이 실습에서는 file1.txt 파일을 모두 건드렸으므로 충돌이 발생한다. master 브랜치에는 "핫픽스"를, feature1 브랜치에는 "기능 1 추가"를 작성하였기 때문이다.

우선 병합을 진행해본다.

# feature1 브랜치로 체크아웃 후 로그 확인
yegang@yegangs:~/hello-git-cli$ git checkout feature1
Switched to branch 'feature1'
yegang@yegangs:~/hello-git-cli$ git log --oneline --all -n2
ef34ef4 (origin/master, master, hotfix) hotfix 실습
247cb34 (HEAD -> feature1) 새로운 기능 1 추가

# master 브랜치와 병합 시도
yegang@yegangs:~/hello-git-cli$ git merge master
Auto-merging file1.txt
CONFLICT (content): Merge conflict in file1.txt
Automatic merge failed; fix conflicts and then commit the result.

# 로그 확인
yegang@yegangs:~/hello-git-cli$ git status
On branch feature1
You have unmerged paths.
  (fix conflicts and run "git commit")
  (use "git merge --abort" to abort the merge)

Unmerged paths:
  (use "git add <file>..." to mark resolution)
        both modified:   file1.txt

no changes added to commit (use "git add" and/or "git commit -a")

# 파일 수정
yegang@yegangs:~/hello-git-cli$ cat file1.txt
hello test
second
third - mybranch1
fourth - mybranch1
<<<<<<< HEAD
기능 1 추가
=======
핫픽스
>>>>>>> master

yegang@yegangs:~/hello-git-cli$ vi file1.txt
yegang@yegangs:~/hello-git-cli$ cat file1.txt
hello test
second
third - mybranch1
fourth - mybranch1
기능 1 추가
핫픽스

병합에 충돌이 발생하였기 때문에, 파일을 수정하였다.

이제 병합 커밋을 생성하기 위해 파일을 스테이징하고 상태를 확인해 보겠다.

yegang@yegangs:~/hello-git-cli$ git add file1.txt

yegang@yegangs:~/hello-git-cli$ git status
On branch feature1
All conflicts fixed but you are still merging.
  (use "git commit" to conclude merge)

Changes to be committed:
        modified:   file1.txt

모든 충돌이 해결되었고 병합 중에 있다고 나온다. 이제 커밋하여 병합을 완료할 수 있다.

yegang@yegangs:~/hello-git-cli$ git commit
[feature1 65352c8] Merge branch 'master' into feature1
yegang@yegangs:~/hello-git-cli$ git log --oneline --all --graph -n4
*   65352c8 (HEAD -> feature1) Merge branch 'master' into feature1
|\
| * ef34ef4 (origin/master, master, hotfix) hotfix 실습
* | 247cb34 새로운 기능 1 추가
|/
* db8ebff (tag: v0.1) mybranch1의 두 번째 커밋

댓글

가장 많이 본 글