IT/Mobile2017. 2. 21. 01:29

 


안녕하세요. IT반장입니다.

이번 시간에는 핸드폰 루팅 방법에 대해서 알아보겠습니다.

루팅이란 핸드폰 운영체제의 루트(root) 관리자 계정을 획득하는 것을 의미합니다. 즉, 핸드폰 운영체체를 해킹해서 관리자 권한을 획득하고, 제조사가 막아놓은 다양한 시스템 자원에 접근이 가능하도록 하는 것입니다.

※  안드로이드 운영체제는 리눅스 기반이기 때문에 관리자 권한이 root 계정으로 관리됩니다. 하여 '루팅(rooting)' 이라고 하고, 이와 다르게 애플 아이폰(IOS 운영체제)에서는 '탈옥(Jail Break)'이라고 합니다.



목차

0. 주의 사항

1. 루팅 프로그램 다운로드

2. 루팅 프로그램 설치

3. 루팅 프로그램 실행

4. 루팅 여부 확인하기





0. 주의 사항


단점

- 루팅을 검사하는 주요 금융, 게임 어플 등이 실행되지 않을 수 있습니다.

- 시스템 자원에 접근하여 핸드폰이 오동작할 수 있습니다.

※ 오류 발생시 서비스센터에 방문할 각오를 하시고 진행하세요.

※ 첨부 또는 링크된 파일의 안전성 유무를 보장하지 않습니다.


장점

- 제조사에서 기본 설치되었으나, 사용하지 않는 앱을 삭제할 수 있습니다.(성능 향상)

- 관리자 권한으로 실행되는 앱을 실행할 수 있습니다.

※ 성능 최적화, 시작 프로그램 제거, 장치 관리, 시스템 파일 관리, 부트 프로그램, 배터리 최적화, CPU 오버클럭


1. 루팅 프로그램 다운로드


루팅의 방법은 여러가지가 있지만, 최근에는 핸드폰에 루팅 프로그램을 다운로드하여 실행만 하면 루팅이 가능합니다.

현재 대표적인 루팅 프로그램으로 KingRoot [1], KingoRoot [2] 등의 프로그램이 있습니다.


- 인터넷 브라우저를 열고 KingRoot(https://kingroot.net)에 접속하여 루팅 프로그램을 다운로드합니다.

 



2. 루팅 프로그램 설치


- 다운로드한 파일을 클릭하여 실행합니다.


- 출처를 알 수 없는 앱 설정을 "허용"으로 변경합니다.


- 다시 KingRoot 설치 프로그램을 실행합니다.

(파일관리자를 실행하여 Download 디렉토리에 저장된 설치 프로그램 실행)


3. 루팅 프로그램 실행


- 루팅 프로그램을 실행하고, "Try"를 클릭하여 루팅을 합니다.


4. 루팅 여부 확인하기


- '구글 플레이 스토어'에서 루트 체크 프로그램을 다운로드하고, 설치합니다.

 


- 앱을 실행하고, "Allow"를 클릭하여 루트 권한을 부여합니다.


- 루트 체크를 클릭하여 루팅 여부를 확인합니다.


참고 목록

[1] https://kingroot.net/

[2] https://www.kingoapp.com/


문서 이력

- v1.0 (20170221) :  최초 등록



도움이 되셨다면 공감 ♡ 눌러 주세요.^^

반응형
Posted by ITBJ
IT/Mobile2017. 2. 16. 22:47

 

안녕하세요. IT반장입니다.

이번 시간에는 LG GPRO2 핸드폰을 안드로이드4.4(킷캣) 버전으로 초기화하는 방법을 소개하겠습니다.

(핸드폰이 벽돌이 되었을때에도 복구가 가능합니다.)



목차

0. 주의 사항

1. 복구프로그램 다운로드

2. 복구이미지파일 다운로드

3. 핸드폰을 데이터케이블로 PC와 연결하기

4. 다운로드 모드로 들어가기

5. 복구프로그램으로 복구하기





0. 주의 사항


- 핸드폰의 모든 데이터가 삭제되고, 핸드폰이 오동작 할 수 있습니다. 따라서 모든 데이터를 백업하시기 바랍니다.

- 배터리를 최소 50% 이상 충전 후에 진행하시기 바랍니다. (외장 배터리 충전기로 충전하는 방법도 좋습니다.)

※ 오류 발생시 서비스센터에 방문할 각오를 하시고 진행하세요.

※ 첨부 또는 링크된 파일의 안전성 유무를 보장하지 않습니다.


1. 복구프로그램 다운로드


LG복구프로그램 2014년 버전을 PC에 다운로드합니다. 

LG Flash Tool 2014.zip

2. 복구이미지파일 다운로드


LG GPRO2의 킷캣버전 이미지 파일은 아래 링크에서 PC에 다운로드합니다.


- 곰돌롬사이트 [1]

※ GPRO2 F350K(KT)F350S(SKT)F350L(LG) 해당 통신사 이미지를 다운로드합니다.


3. 핸드폰을 데이터케이블로 PC와 연결하기


- 핸드폰을 종료한 상태에서 데이터(충전)케이블로 PC와 연결합니다.

※ 사전에 핸드폰 배터리를 50%이상 충전하시는게 좋습니다.


4. 다운로드 모드로 들어가기


- GPRO2 핸드폰의 "전원버튼+볼륨업" 버튼을 동시에 5초이상 눌러서 다운로드 모드로 들어갑니다.


5. 복구 프로그램으로 복구하기


- 다운로드 받은 복구 프로그램을 압축을 풀어서 실행합니다.


- PhoneMode를 CS_EMERGENCY로 선택합니다.

- KDZ 파일을 선택합니다. (곰돌롬사이트에서 다운 받은 파일)

- "CSE Flash" 버튼을 누룹니다.


- "Start" 버튼을 누룹니다.


- "OK" 버튼을 눌러서 복구를 시작합니다.


- 핸드폰에서 복구가 시작됩니다.


- 복구가 완료되면 재부팅후 아래와 같이 설정화면이 나옵니다.


참고 목록

[1] http://gomdolight.com/?page_id=459#howto_firmwarecompatability


문서 이력

- v1.0 (20170220) :  최초 등록



도움이 되셨다면 공감 ♡ 눌러 주세요.^^

반응형
Posted by ITBJ
IT/Mobile2017. 2. 14. 05:27


 

안녕하세요. IT반장입니다.

이번 시간에는 LG GPRO2 핸드폰을 안드로이드6.0(마시멜로 기반인 사이애노젠모드 CyanogenMod13[1]버전으로 업그레이드하는 방법을 소개하겠습니다.



목차

0. 주의 사항

1. 킷캣 버전으로 초기화

2. 부트 파일 등 다운로드

3. 핸드폰으로 파일 옮기기

4. 루팅하기

5. 부트 프로그램 설치

6. 리커버리 이미지 설치

7. 부트 파일 등 설치

8. 설정 및 확인





0. 주의 사항


- 핸드폰의 모든 데이터가 삭제되고, 핸드폰이 오동작 할 수 있습니다.

  ※ 모든 데이터를 백업하시고, 복구 방안을 사전에 마련해 놓으시기 바랍니다.

- CM13으로 설치하시면 외장디스크 인식 오류, 기타 장치 인식 오류 등이 발생할 수 있습니다.


※ 핸드폰 벽돌 초기화 등을 해보지 않으신 분들은 서비스센터에 방문할 각오를 하시고 진행하세요.

※ 첨부 또는 링크된 파일의 안전성 유무를 보장하지 않습니다.


1. 킷캣 버전으로 초기화


LG GPRO2 핸드폰을 킷캣 버전으로 초기화합니다.(아래 링크 참조)

2017/02/16 - [모바일] - LG GPRO2 킷캣(안드로이드4.4 Kitkat)버전으로 초기화 하기

※ 핸드폰이 벽돌(사용 불능 상태)이 되었을 때에도 이 방법으로 복구합니다.


2. 부트 파일 등 다운로드


아래 파일을 PC 또는 핸드폰에 다운로드 합니다.


1) 리커버리 파일 : 다운로드

2) 부트 파일 : 다운로드

3) CM13 이미지 : 다운로드

4) GApps 이미지 : 다운로드


5) 기타 (※ 플레이스토어에서도 다운로드 가능)

- 부트 프로그램 :  Flashify 

- 루팅 프로그램 : KingRoot


3. 핸드폰으로 파일 옮기기


- 핸드폰을 PC와 데이터케이블로 연결합니다.


- 핸드폰에서 데이터전송 타입을 "MTP"로 선택합니다.


- "내컴퓨터"에서 휴대용 장치에 GPro 2가 인식되면 "\컴퓨터\G Pro 2\내부 저장소\Download" 디렉토리에 해당 파일을 복사합니다.

※ PC에서 핸드폰으로 파일을 복사하거나, 또는 핸드폰에서 다운로드 하셔도 됩니다.


4. 루팅 하기


킷캣 버전에서 루팅을 합니다. (아래 링크 참조)

2017/02/21 - [모바일] - 핸드폰 초간단 루팅 방법

※ 루팅 프로그램을 PC에서 핸드폰으로 옮겨서 실행해도 됩니다.


5. 부트 프로그램 설치


- 구글 플레이스토어에서 'Flashify'를 검색하여 설치합니다.

※ 부트 프로그램(Flashify)을 PC에서 핸드폰으로 옮겨서 실행해도 됩니다.


6. 리커버리 이미지 설치 [2][3][4]


- 'Flashify'를 실행하여 루트 권한을 부여합니다. ("Allow")


- Recovery Image -> Choose a file 을 선택

 


 File Explorer -> "storage/emulated/0/Download/recovery.img" 선택
 
 

 YUP 선택 -> Reboot NOW 선택

 

※ 재부팅이 되면 TWRP 부트 프로그램이 실행됩니다.


7. 부트 파일 등 설치


재부팅이 되면 TWRP 부트 프로그램이 아래와 같이 실행됩니다.


- "Keep System Read only?" 화면 에서 "Swipe to Allow Modifications" 화살표를 선택하여 좌에서 우로 드래깅합니다.


Wipe -> Advanced Wipe -> "Dalvik/ART cache", "Data", "Cache" 선택 -> "swipe to Wipe" 화살표를 드래깅합니다. 


- "하단 중앙 홈버튼"을 눌러서 부트 프로그램 홈으로 이동합니다.


- "Install"을 누르고, "/sdcard/Download/_to_20d.zip"을 선택하고 "Swipe to confirm Flash"화살표를 드래깅합니다.


- 완료가 되면 다시 "하단 중앙 홈버튼"을 눌러서 부트 프로그램 홈으로 이동합니다.


- "Install"을 누르고, "/sdcard/Download/cm-13.0-20160429-UNOFFICIAL-d838.zip"을 선택하고 "Swipe to confirm Flash"화살표를 드래깅합니다.


- 완료가 되면 다시 "하단 중앙 홈버튼"을 눌러서 부트 프로그램 홈으로 이동합니다.


- "Install"을 누르고, "/sdcard/Download/open-gapps-arm-6.0-stock-20170205.zip"을 선택하고 "Swipe to confirm Flash"화살표를 드래깅합니다.






- 완료가 되면 다시 "하단 중앙 홈버튼"을 눌러서 부트 프로그램 홈으로 이동합니다.


Wipe -> Advanced Wipe -> "Internal Storage" 선택 -> "swipe to Wipe" 화살표를 드래깅합니다. 


- Reboot System 을 선택합니다.


- 사이애노젠모드 아이콘이 나오면서 설치를 시작합니다. (5분 정도 소요)


8. 설정 및 확인


- 한국어를 선택하고, 기타 설정을 합니다.


- 설정이 완료되면, 환경설정에서 설치된 안드로이드 버전(6.0.1)을 확인합니다.


참고 목록

[1] https://ko.wikipedia.org/wiki/CyanogenMod

[2] http://rootoreviews.com/root-LG-G-Pro-2-install-twrp-custom-recovery

[3] https://forum.xda-developers.com/lg-g-pro-2/development/cyanogenmod-13-lg-g-pro-2-d838-t3357883

[4] http://cafe.naver.com/develoid/625394


문서 이력

- v1.0 (20170227) :  최초 등록


도움이 되셨다면 공감♡ 눌러 주세요.^^

반응형
Posted by ITBJ
IT/Blogging2017. 2. 10. 18:42



안녕하세요. IT반장입니다.

이번 시간에는 티스토리 블로그 만드는 방법에 대해서 알아보겠습니다.


우선 블로그를 만드는 목적에 대해서 알아보겠습니다.

사람들은 왜 블로깅을 하는가?



◈ 블로깅의 목적


1. 자신의 컨텐츠(이야기, 지식, 비평, 자료 등)를 인터넷에 쉽게 공유/보관/홍보할 수 있다.

※ 특히 블로그 마케팅 회사에서 말하는 마케팅 효과는 한 블로그 당 수천만원에 달합니다.



2. 광고를 삽입하여 광고 수익을 올릴 수 있다.

※ 구글 애드센스 등의 광고를 넣었을때, 1만뷰에 5천원 정도의 수입이 발생한다고 합니다. (즉 1번 방문에 0.5원 정도라고 보면 되겠습니다.)



◈ 티스토리 블로그 만들기


1. 티스토리 사이트에서 초대장을 받습니다.

1) 모바일 앱스토어(구글 플레이스토어, 애플 앱스토어)에서 티스토리앱을 설치하여 가입합니다. (추천)



2) 또는 http://tistory.com/invitation 에 접속하여 "초대장 받기"를 클릭하고 블로거들로 부터 초대장을 받습니다.


※ 참고: http://notice.tistory.com/1787


2. 티스토리 사이트에 접속하여 회원정보를 수정합니다.



3. "내 블로그 만들기"를 클릭하여, 자신만의 블로그 제목과 주소를 만듭니다.

예) 제목 : 티스토리 블로그 만들기, 주소: tbmake 등으로 입력합니다.


   

※ 총 10회의 블로그 생성이 가능하고, 동시 운영수는 5개입니다.



4. 내 블로그 -> 관리 를 클릭하여, 설정화면으로 들어갑니다.



5. 글쓰기 버튼을 눌러서 글을 작성합니다. 



6. 우상단 "기본설정 -> 공개 -> 주제"를 선택하고, 태그를 입력한 뒤 발행을 누릅니다.


7. 상단 "내 블로그"를 클릭하여 제대로 글이 발행되었는지 확인합니다.


※ 모바일에서도 글을 확인해보고, 대표이미지 설정, 폰트 등을 변경할 수 있습니다.


반응형
Posted by ITBJ
IT/Mobile2017. 2. 10. 01:16


안녕하세요. IT반장입니다.


핸드폰을 사용하다 보면 오류가 발생하거나 먹통(벽돌)이 되는 경우가 있습니다.

이런 경우에는 핸드폰을 초기화해야 하는데요.


이번 시간에는 LG에서 제공하는 복구프로그램으로 LG GPRO2 핸드폰의 복구 방법에 대해서 알아보겠습니다.


◈ 준비물:

1. 핸드폰(LG GPRO2)

2. 데이터(충전)케이블

3. 인터넷이 가능한 PC 


◈ 사전 작업

※ 내장/외장 메모리 백업은 필수입니다. 업그레이드시 저장된 데이터(주소록, 문자, 사진 등)가 삭제될 수 있습니다.
 

◈ 복구 절차

1. 핸드폰 배터리를 충분히 충전합니다. (50% 이상)

※ 배터리 충전 상태를 확인할 수 없을 때에는 최소 1-2시간 이상 충전이 필요합니다. 외장 충전기로 충전하는 것도 하나의 방법입니다.

2. "LG전자 다운로드센터" 사이트에서 "업그레이드 시작하기"로 PC에 프로그램을 다운로드 합니다. (파일 첨부 LGMobileSupportTool.exe


- http://www.lge.co.kr/lgekor/download-center/downloadCenterList.do#none


3. "LG Mobile Support Tool" 프로그램을 PC에 설치하여 실행합니다.



4. USB 드라이버를 설치합니다.


5. 핸드폰이 꺼진 상태에서 핸드폰과 PC를 데이터케이블로 연결합니다.



6. 케이블이 연결된 상태에서, 핸드폰 뒷면의 "볼륨업버튼+전원버튼"을 동시에 3초이상 눌러서 "Download Mode"로 들어갑니다.
 



※ 핸드폰이 정상적으로 부팅이 가능하다면 정상 부팅 화면에서도 업그레이드 가능합니다.


7. 핸드폰이 프로그램에서 인식이 되면, 우상단에서 "부가기능"->"업그레이드 오류 복구" 또는 좌상단에서 "업그레이드 시작하기"를 선택합니다.
   - 업그레이드 오류 복구: 핸드폰이 벽돌(부팅이 안될때)이 되었을때도 업그레이드 가능(추천)
   - 업그레이드 시작하기: 핸드폰이 정상 사용 가능할 때


8. 핸드폰이 업그레이드가 완료되고 재부팅되면, 초기 설치 화면이 나옵니다.



9. 기본 사용자 설정(네트워크, 구글 계정 등)을 하고 핸드폰 "설정->일반->소프트웨어 정보"에서 안드로이드 버전을 확인합니다.



※ Android 버전이 5.0.1로 복구 된 것을 알수 있습니다.


※ LG GPRO2 이외의 다른 LG폰에서도 동일한 방식으로 업그레이드 가능합니다. 잘되신분들은 핸드폰 기종과 성공 여부 덧글로 남겨주세요. 안되시는분들도 핸드폰 기종 남겨주시면 다른분들에게 도움이 되겠습니다. 



반응형
Posted by ITBJ
IT/Security2017. 2. 9. 19:10

 


이 글에서는 자바 암호 프로그래밍을 위하여 Eclipse와 JDK를 설치하고 SUN JCE를 이용해서 AES 암호화 하는 방법에 대해서 알아보겠습니다.


 

 

안녕하세요. IT반장입니다.

이번 글에서는 '자바 암호 프로그래밍'을 하기 위한 가장 기초적인 단계인 '개발 도구 설치'에 대해서 알아보겠습니다. 자바 프로그래밍에서 가장 많이 쓰이는 Eclipse(Java IDE)와 JDK(Java Development Kit) 설치 방법에 대해서 설명하고, SUN JCE 라이브러리로 AES 암복호화 하는 방법에 대해서 알아보겠습니다.


 

 

1. Eclipse 다운로드 및 설치


■ Eclipse 다운로드

http://www.eclipse.org/downloads [1]에서 최신 버전의 Eclipse를 다운로드 받습니다. ('제 PC는 windows7 64비트 환경이어서 자동으로 64비트 다운로드 버튼이 보이네요.')



 

■ Eclipse 설치

1) 다운로드 받은 설치파일을 실행하고, 설치 화면에서 'Eclipse IDE for Java Developers"를 선택


 

2) 설치할 디렉토리 지정 (여기서는 "c:\eclipse"로 지정)


 

3) 라이선스 동의


 

4) 설치 완료 후 실행('LAUNCH')


 

5) 작업디렉토리(workspace) 지정(여기서는 "C:\eclipse\workspace")


 

6) 설치 완료 !

※ eclipse가 실행이 안 되시는 분은 Java(JRE)가 시스템에 설치가 안되어 있을 수 있습니다. http://www.java.com 에서 JRE를 설치하시고 실행하시면 됩니다.

 

 

2. JDK 다운로드 및 설치

- eclipse가 동작한다면 해당 PC 또는 개발 시스템에 JDK 또는 JRE가 이미 설치되어 있을 겁니다. 여기서는 개발 환경의 독립성, 호환성을 위해서 별도의 JDK/JRE를 설치합니다.

 

■ JDK 다운로드 [2]

http://www.oracle.com/technetwork/java/javase/downloads/index.html 에서 JDK를 다운로드 받습니다.


 

- 라이선스에 동의하고 시스템에 맞는 버전을 다운로드 합니다. (여기서는 8u102 JDK와 Demo/Sample을 다운로드 합니다.)



■ JDK 설치

- 다운로드 한 JDK실행파일을 실행합니다.


 

- JDK 설치 디렉토리를 "C:\eclipse\jdk1.8.0_102"로 지정합니다. (개발 환경의 독립성을 위해 별도의 디렉토리에 설치합니다.)


 

- JRE 설치 디렉토리를 "C:\eclipse\jre1.8.0_102"로 지정합니다. (개발 환경의 독립성을 위해 별도의 디렉토리에 설치합니다.)


 

- 설치가 완료되면 'Next Steps' 버튼을 눌러 'java document'를 확인합니다.


 


※ Java에서 제공하는 많은 기능 중에, 암호 프로그래밍을 위해 우선 일부(java, security tool 등)만 사용하게 될 것입니다.

 

 

3. 개발 환경 설정하기

- eclipse와 jdk/jre 가 설치 완료되었으니, 설치한 개발 도구들을 독립적인 환경으로 설정해 보겠습니다.

※ 여기서 '독립적 환경'이란 '컴파일 환경'(jdk)과 '실행 환경'(jre)을 동일하게 하여 개발시스템에 의존적이지 않도록 하는 것을 말합니다. 즉, 개발 환경만을 위해 jdk와 jre를 별도로 설치해서 환경을 구성하는 겁니다.

 

■ eclipse 환경 설정하기

- eclipse 실행 후 Window->Preference 선택


 

- Java->Compiler->Installed JREs 선택


 

- Add->'Standard VM'->Next 선택


 

- Directory->"C:\eclipse\jdk1.8.0_102" 선택 ->Finish


 

- 새로 설치한 "jdk1.8.0_102" 체크박스 선택 -> OK(또는 Apply) 선택


※ 이제 새로 설치한 JDK가 'eclipse 기본 Java 환경'으로 됩니다.

 

 

4. '자바 암호 프로그래밍' 시작하기


■ Eclipse 프로젝트 시작하기

- File -> New -> Java Project 선택


 

- Project name : "EncryptionTest01"로 입력하고

- JRE -> 'Use a project specific JRE' 선택 -> 'jdk1.8.0_102' 선택 -> Finish 선택


 

- 'JRE System Library'에서 라이브러리들이 "C:\eclipse\jdk1.8.0_102\..."에 위치한 것인지 확인

 

 

■ AES 암호화 및 복호화 프로그래밍

※ 여기서는 OWASP [3]에서 제공하는 SUN JCE(Java Cryptography Extension) 예제로 설명하겠습니다. [4]

- src 우클릭 -> New -> Class 선택


 

- Name: "AES" 입력 -> Finish



- 소스 복사 : OWASP AES 예제 소스[4]를 복사하여 붙여 넣기

※ 첫 번째 줄 빼고, 복사한다. ("package org.owasp.java.crypto;")


 

※ 참고 소스(AES암호화)[4]

  1. import java.security.InvalidAlgorithmParameterException;  
  2. import java.security.InvalidKeyException;  
  3. import java.security.NoSuchAlgorithmException;  
  4. import java.security.SecureRandom;  
  5.     
  6. import javax.crypto.BadPaddingException;  
  7. import javax.crypto.Cipher;  
  8. import javax.crypto.IllegalBlockSizeException;  
  9. import javax.crypto.KeyGenerator;  
  10. import javax.crypto.NoSuchPaddingException;  
  11. import javax.crypto.SecretKey;  
  12. import javax.crypto.spec.IvParameterSpec;  
  13.     
  14. import sun.misc.BASE64Encoder;  
  15.     
  16. /** 
  17.  * @author Joe Prasanna Kumar 
  18.  * This program provides the following cryptographic functionalities 
  19.  * 1. Encryption using AES 
  20.  * 2. Decryption using AES 
  21.  *  
  22.  * High Level Algorithm : 
  23.  * 1. Generate a AES key (specify the Key size during this phase)  
  24.  * 2. Create the Cipher  
  25.  * 3. To Encrypt : Initialize the Cipher for Encryption 
  26.  * 4. To Decrypt : Initialize the Cipher for Decryption 
  27.  *  
  28.  *  
  29.  */  
  30.     
  31. public class AES {  
  32.     public static void main(String[] args) {  
  33.             
  34.         String strDataToEncrypt = new String();  
  35.         String strCipherText = new String();  
  36.         String strDecryptedText = new String();  
  37.     
  38.         try {  
  39.             /** 
  40.              * Step 1. Generate an AES key using KeyGenerator Initialize the 
  41.              * keysize to 128 bits (16 bytes) 
  42.              *  
  43.              */  
  44.             KeyGenerator keyGen = KeyGenerator.getInstance("AES");  
  45.             keyGen.init(128);  
  46.             SecretKey secretKey = keyGen.generateKey();  
  47.     
  48.             /** 
  49.              * Step 2. Generate an Initialization Vector (IV)  
  50.              *      a. Use SecureRandom to generate random bits 
  51.              *         The size of the IV matches the blocksize of the cipher (128 bits for AES) 
  52.              *      b. Construct the appropriate IvParameterSpec object for the data to pass to Cipher's init() method 
  53.              */  
  54.     
  55.             final int AES_KEYLENGTH = 128;  // change this as desired for the security level you want  
  56.             byte[] iv = new byte[AES_KEYLENGTH / 8];    // Save the IV bytes or send it in plaintext with the encrypted data so you can decrypt the data later  
  57.             SecureRandom prng = new SecureRandom();  
  58.             prng.nextBytes(iv);  
  59.                 
  60.             /** 
  61.              * Step 3. Create a Cipher by specifying the following parameters 
  62.              *      a. Algorithm name - here it is AES  
  63.              *      b. Mode - here it is CBC mode  
  64.              *      c. Padding - e.g. PKCS7 or PKCS5 
  65.              */  
  66.     
  67.             Cipher aesCipherForEncryption = Cipher.getInstance("AES/CBC/PKCS5PADDING"); // Must specify the mode explicitly as most JCE providers default to ECB mode!!  
  68.     
  69.             /** 
  70.              * Step 4. Initialize the Cipher for Encryption 
  71.              */  
  72.     
  73.             aesCipherForEncryption.init(Cipher.ENCRYPT_MODE, secretKey,   
  74.                     new IvParameterSpec(iv));  
  75.     
  76.             /** 
  77.              * Step 5. Encrypt the Data  
  78.              *      a. Declare / Initialize the Data. Here the data is of type String  
  79.              *      b. Convert the Input Text to Bytes  
  80.              *      c. Encrypt the bytes using doFinal method 
  81.              */  
  82.             strDataToEncrypt = "Hello World of Encryption using AES ";  
  83.             byte[] byteDataToEncrypt = strDataToEncrypt.getBytes();  
  84.             byte[] byteCipherText = aesCipherForEncryption  
  85.                     .doFinal(byteDataToEncrypt);  
  86.             // b64 is done differently on Android  
  87.             strCipherText = new BASE64Encoder().encode(byteCipherText);  
  88.             System.out.println("Cipher Text generated using AES is "  
  89.                     + strCipherText);  
  90.     
  91.             /** 
  92.              * Step 6. Decrypt the Data  
  93.              *      a. Initialize a new instance of Cipher for Decryption (normally don't reuse the same object) 
  94.              *         Be sure to obtain the same IV bytes for CBC mode. 
  95.              *      b. Decrypt the cipher bytes using doFinal method 
  96.              */  
  97.     
  98.             Cipher aesCipherForDecryption = Cipher.getInstance("AES/CBC/PKCS5PADDING"); // Must specify the mode explicitly as most JCE providers default to ECB mode!!               
  99.     
  100.             aesCipherForDecryption.init(Cipher.DECRYPT_MODE, secretKey,  
  101.                     new IvParameterSpec(iv));  
  102.             byte[] byteDecryptedText = aesCipherForDecryption  
  103.                     .doFinal(byteCipherText);  
  104.             strDecryptedText = new String(byteDecryptedText);  
  105.             System.out  
  106.                     .println(" Decrypted Text message is " + strDecryptedText);  
  107.         }  
  108.     
  109.         catch (NoSuchAlgorithmException noSuchAlgo) {  
  110.             System.out.println(" No Such Algorithm exists " + noSuchAlgo);  
  111.         }  
  112.     
  113.         catch (NoSuchPaddingException noSuchPad) {  
  114.             System.out.println(" No Such Padding exists " + noSuchPad);  
  115.         }  
  116.     
  117.         catch (InvalidKeyException invalidKey) {  
  118.             System.out.println(" Invalid Key " + invalidKey);  
  119.         }  
  120.     
  121.         catch (BadPaddingException badPadding) {  
  122.             System.out.println(" Bad Padding " + badPadding);  
  123.         }  
  124.     
  125.         catch (IllegalBlockSizeException illegalBlockSize) {  
  126.             System.out.println(" Illegal Block Size " + illegalBlockSize);  
  127.         }  
  128.     
  129.         catch (InvalidAlgorithmParameterException invalidParam) {  
  130.             System.out.println(" Invalid Parameter " + invalidParam);  
  131.         }  
  132.     }  
  133. }  

 

- Run As -> Java Application 선택 (소스를 컴파일하고 실행한다.)


 

- 에러가 발생하는지 확인한다.

("No Such Algorithm exists java.security.NoSuchAlgorithmException: Cannot find any provider supporting AES/CBC/PKCS7PADDING")

※ 해당 에러는 SUN JCE에서 해당 패딩을 지원하지 않기 때문입니다.[5][6] 자바 버전9부터는 포함시킨다고 합니다.


 

- "AES/CBC/PKCS7PADDING"을 "AES/CBC/PKCS5PADDING"로 수정합니다. (라인 67, 98)


 

- Run As -> Java Application 선택하여 다시 실행


※ 하단 콘솔 창에 암복호화 결과를 확인할 수 있습니다.


 

 

이번 글에서는 '자바 암호 프로그래밍'을 하기 위한 가장 기초적인 단계인 '개발 도구 설치'(Eclipse, JDK)와SUN JCE 라이브러리로 AES 암복호화 하는 방법에 대해서 알아보았습니다. JCE로도 간단히 구현할 수는 있지만 아직까지는 bouncycastle 라이브러리만큼의 호환성을 보장하지 않습니다. 하지만 간단한 데이터 암호화 정도는 쉽게 적용이 가능합니다.

 

 

 

참고 목록

[1] http://www.eclipse.org/downloads

[2] http://www.oracle.com/technetwork/java/javase/downloads/index.html

[3] https://www.owasp.org/

[4] https://www.owasp.org/index.php/Using_the_Java_Cryptographic_Extensions

[5] http://bugs.java.com/bugdatabase/view_bug.do?bug_id=8076969

[6] https://docs.oracle.com/javase/8/docs/technotes/guides/security/StandardNames.html#pkcs5Pad

 

 

문서 이력

- v1.00(2016.09.06) : 최초 등록

반응형
Posted by ITBJ
IT/Security2017. 2. 9. 18:59

 


이 글에서는 자바 암호 패키지인 JCA(Java Cryptography Architecture)와 JCE(Java Cryptography Extension)에 대해서 알아보고, 실무 활용 방법에 대해서 알아보겠습니다.


 

 

안녕하세요. IT반장입니다.

최근에 많은 프로그램들이 자바 언어로 만들어지고 있습니다. 서버 프로그램뿐 만 아니라 클라이언트 프로그램도 자바 언어로 프로그래밍 되는 경우가 많습니다. (예, 스프링프레임워크, 안드로이드 등) 그리고 자바 언어에서는 암호화를 위해 JCA(Java Cryptography Architecture)와 JCE(Java Cryptography Extension) 패키지를 제공하고 있습니다. 이 글에서는 암호 프로그래밍에서 쉽게 자주 접하게 되는 JCA와 JCE에 대해서 알아보고 실무 활용 방법을 설명하겠습니다.


 

 

1. JCA(Java Cryptography Architecture) [1][2]

 

  • 소개

  • JCA는 자바 프로그래밍 언어의 암호화를 위한 프레임워크입니다. JDK1.1 java.security 패키지에 처음 소개되었습니다.
  • 'Provider"-based architecture'를 사용하고 암호화, 키 생성 및 관리, 'secure random number' 생성, 인증서 검증 등의 API를 포함하고 있습니다.
  • JCA는 구현 독립성/호환성, 알고리즘 확장성을 고려하여 설계되었습니다.
    • 구현 독립성: 보안 기능별 독립된 제공자(provider)로 프로그래밍
    • 구현 호환성: 프로그램들간 추상화된(고정되지 않은) 제공자를 통해서 호환
    • 알고리즘 확장성: 대부분의 알고리즘을 지원하고, 임의의 제공자(provider) 추가 가능
  • JDK 1.4 이상에서는 JCE(Java Cryptography Extention)도 기본 포함됩니다.
  • 관련 암호 서비스를 정의하고 지원하기 위한 'Provider Framework'(java.security, javax.crypto, javax.crypto.spec, javax.crypto.interfaces 패키지)와 'Provider'(실제 암호 구현 내용이 포함된 Sun, SunRsaSign, SunJCE 패키지)를 제공합니다.

 

[참고] 기타 JDK 암호 라이브러리

  • JSSE(Java Secure Socket Extension): SSL/TLS 기능 제공
  • JGSS(Java Generic Security Services): Kerberos, 네트워크 보안 기능 제공
  • SASL(Simple Authentication and Security Layer): 네트워크 보안 기능 제공

 

  • 구조


[그림0] MD5 메시지 다이제스트 구현 설명도

[그림0]에서 보듯이 각각의 어플리케이션은 'Provider Framework'를 통해서 각각의 독립적인 'Provider'에 접근해서 암호 기능을 구현할 수 있습니다.

 

  • 키 관리
    • 키와 인증서들의 저장소를 관리하는 'keystore'가 있습니다.
    • java.security.KeyStore 클래스
    • .jks 파일 형태로 구현됨(또는 3DES로 암호화된 .jceks)
    • 어플리케이션은 각각의 'Provider'로부터 개별적인 keystore 구현 가능

       

  • 주요 클래스

클래스명(인터페이스명)

내용

Provider 

기본 Provider 클래스

Security 

Provider' 및 'security property' 관리

SecureRandom 

난수(random number) 생성

MessageDigest 

해시값 생성

Signature 

전자 서명 & 검증

Cipher

블록 암호(AES, DES, DESede, Blowfish, IDEA 등), 스트림 암호(RC4 등), 비대칭 암호(RSA 등), 패스워드 암호 (PBE 등) 등 제공

MAC

(Message Authentication Codes) 

MAC(해시값 생성 & 무결성 보장 기능)

Key(Key)  

기본 키 클래스(인터페이스)

KeyFactory 

키 타입 변환

SecretKeyFactory 

대칭키 타입 변환

KeyPairGenerator 

공개키/개인키 생성

KeyGenerator 

대칭키 생성

KeyAgreement 

키 교환 정보

KeyStore 

키 관리

AlgorithmParameters 

알고리즘 파라미터

AlgorithmParameterGenerator  

알고리즘 파라미터 생성

CertificateFactory 

인증서, 인증서폐기목록(CRL) 생성

CertPathBuilder 

인증서체인 생성

CertPathValidator 

인증서체인 검증

CertStore 

인증서, 인증서폐기목록(CRL) 관리

[표1] JCA 주요 클래스

 

  • 전자서명


[그림1] 전자서명 및 검증 설명도

 

  1. /* 키생성을 위한 KeyPairGenerator 클래스 생성 */  
  2. KeyPairGenerator keyGen = KeyPairGenerator.getInstance("DSA");  
  3.  
  4. /* 랜덤값 생성 */
  5. SecureRandom random = SecureRandom.getInstance("SHA1PRNG""SUN");  
  6. keyGen.initialize(1024, random);  
  7.  
  8. /* KeyPair 생성 */
  9. KeyPair pair = keyGen.generateKeyPair();  
  10.     
  11. /* 'SHA1withDSA' Signature 클래스 생성 */
  12. Signature dsa = Signature.getInstance("SHA1withDSA");  
  13.     
  14. /* 개인키 생성 */
  15. PrivateKey priv = pair.getPrivate();  
  16. dsa.initSign(priv);  
  17.     
  18. /* 데이터를 넣고, 전자서명 */  
  19. dsa.update(data);  
  20. byte[] sig = dsa.sign();  
  21.     
  22. /* 공개키 생성 */  
  23. PublicKey pub = pair.getPublic();  
  24. dsa.initVerify(pub);  
  25.     
  26. /* 데이터를 넣고, 서명검증 */  
  27. dsa.update(data);  
  28. boolean verifies = dsa.verify(sig);  
  29. System.out.println("signature verifies: " + verifies);  

[소스코드1] 전자서명/검증 예제 소스코드

[그림1]과 [소스코드1]은 간단한 전자서명과 검증 예를 설명하고 있습니다. 위와 같이 JCA에서는 키생성, 전자서명/검증을 위한 API를 제공하고 그 외에 다양한 확장 기능을 제공합니다.

 

  • 암호화


[그림2] 암복호화 설명도

 

  1. // 대칭키와 IV 설정
  2. SecretKey myKey = ...  
  3. byte[] myAAD = ...  // 'Additional Associated Data' 로 무결성 확인 용도
  4. byte[] plainText = ...  
  5. int myTLen = ...   
  6. byte[] myIv = ...  
  7.     
  8. // AES GCM모드 암호화를 위한 파라미터 설정
  9. GCMParameterSpec myParams = new GCMParameterSpec(myTLen, myIv);  
  10. Cipher c = Cipher.getInstance("AES/GCM/NoPadding");  
  11. c.init(Cipher.ENCRYPT_MODE, myKey, myParams);  
  12.     
  13. // 암호화  
  14. c.updateAAD(myAAD);  // if AAD is non-null  
  15. byte[] cipherText = new byte[c.getOutputSize(plainText.length)];  
  16. c.doFinal(plainText, 0, plainText.length, cipherText
  17.     
  18. // 복호화를 위한 Cipher 클래스 설정 및 복호화
  19. c.init(Cipher.DECRYPT_MODE, myKey, myParams);  
  20. c.updateAAD(myAAD);  
  21.  
  22. byte[] recoveredText = c.doFinal(cipherText);  
  23.     
  24. // GCM모드에서 동일키 사용을 위한 IV 재생성  
  25. byte[] newIv = ...;  
  26. myParams = new GCMParameterSpec(myTLen, newIv);  

[소스코드2] 암복호화 예제 소스코드


[그림2]와 [소스코드2]는 간단한 대칭키 암호화 예(AES GCM모드)를 설명하고 있습니다. 평문, 대칭키, IV(Initial Vector), ParameterSpec을 설정하고 Cipher.doFinal 메소드를 통해서 암복호화를 할 수 있습니다.

 

  • MAC(Message Authentication Code)

[그림 3] MAC 설명도

  1. import java.security.*;  
  2. import javax.crypto.*;  
  3.     
  4. public class initMac {  
  5.     
  6.     public static void main(String[] args) throws Exception {  
  7.     
  8.         // Generate secret key for HMAC-MD5  
  9.         KeyGenerator kg = KeyGenerator.getInstance("HmacMD5");  
  10.         SecretKey sk = kg.generateKey();  
  11.     
  12.         // Get instance of Mac object implementing HMAC-MD5, and  
  13.         // initialize it with the above secret key  
  14.         Mac mac = Mac.getInstance("HmacMD5");  
  15.         mac.init(sk);  
  16.         byte[] result = mac.doFinal("Hi There".getBytes());  
  17.     }  
  18. }  

[소스코드3] MAC 설명도


[그림3]와 [소스코드3]은 MAC(Message Authentication Code)을 설명하고 있습니다. 메시지("Hi There")의 MAC값을 생성하고, 이후 'Secret Key'를 공유하여 MAC값이 동일한지를 비교합니다.

 

  • Generators 와 Factories

[그림4] Generators와 Factories 설명도


[그림4]에서 보시는 바와 같이 Generator 클래스는 새로운 오브젝트(대칭키 등) 생성을 위한 파라미터를 설정하고, Factory 클래스는 이전에 정의된 오브젝트를 변환할 때 사용됩니다.

 

  • KeyFactory 클래스

[그림5] KeyFactory 클래스 설명도


[그림5]에서 보시는 바와 같이 KeyFactory 클래스는 'Key Spec'으로부터 'Key'를 생성하기도 하고, 반대로 'Key'로부터 'Key Spec'을 추출할 수 있습니다. 'Key Spec'에는 'Key'에 대한 정보가 포함되어 있습니다.

 

  • SecretKeyFactory 클래스

[그림6] SecretKeyFactory 클래스 설명도


[그림6]에서 보시는 바와 같이 'SecretKeyFactory' 클래스는 'Key Spec'에서 대칭키('Secret Key')를 생성할 수 있고, 대칭키로부터 'Key Spec'을 가져올 수 있습니다.

 

  • KeyPairGenerator 클래스

[그림7] KeyPairGenerator 클래스 설명도


[그림7]은 KeyPairGenerator가 두가지 방법으로 공개키/개인키를 생성하는 것을 보여줍니다. 하나는 알고리즘 독립적으로 키를 생성하는 방법이고, 다른 하나는 알고리즘을 정해서 키를 생성하는 방법입니다.

 

  • KeyGenerator 클래스

[그림8] KeyGenerator 클래스 설명도


[그림8]은 KeyGenerator 클래스가 대칭키를 생성하는 방법을 보여줍니다. 마찬가지로 알고리즘을 정해서 생성하는 방법과 그렇지 않은 방법이 있습니다.

 

  • KeyAgreement 클래스

[그림9] KeyAgreement 클래스 설명도


[그림9]은 Alice와 Bob이 DH 'Key Agreement'를 하는 과정을 보여줍니다. 공개키를 서로 교환하고 'Secret Key'를 생성하여 동일한지를 비교합니다.

 

  • KeyStore 클래스

[그림10] KeyStore 클래스


[그림10]는 KeyStore 클래스를 보여줍니다. 신뢰된 인증기관 인증서(Trusted Certificate), 공개키/개인키, 대칭키를 저장/추출할 수 있고, 파일 형태로 저장되는 것을 알 수 있습니다.

 



2. JCE(Java Cryptography Extension)

JCE는 JCA보다 더 강력한 확장된 보안 기능을 제공합니다. 미국에서 보안상 이유로 2000년 이후에나 해외로 보급되었습니다.[5]


[그림11] JCA와 JCE 구조 설명도

[그림11]에서 보시는 것처럼 JCA(java.security 패키지)와 JCE(javax.crypto 패키지)가 분리되어 있는 것을 알 수 있습니다. JDK1.4 이상부터는 모두 기본으로 포함되어 있습니다.

JCE에 포함되는 클래스는 Cipher, KeyGenerator, SecretKeyFactor, KeyAgreement, MAC 등입니다.


여기서 SUN JCE와 BouncyCastle 을 비교하겠습니다. [3][4]

  

장점

단점

SUN JCA/JCE 

- JDK에 포함되어 있음
- 'provider'를 선택해서 사용할 수 있음

- JDK 별로 provider가 일치하지 않아서 동작하지 않을 수 있음 (Java mobile 등)
- 알고리즘을 많이 제공하지 않음

Bouncy

Castle 

- JCA보다 많은 알고리즘을 지원

* SEED128 알고리즘 지원
- 사용에 아무런 제한이 없음(128비트 암호키 제한 등[5])

- 라이브러리 파일을 프로젝트에 추가시켜야함

[표2] JCA/JCE 와 BouncyCastle 비교


[표2]에서 보시는 것처럼 BouncyCastle이 더 많은 알고리즘 지원 및 호환성이 좋은 것을 알 수 있습니다. 특히, 국산암호알고리즘 SEED를 지원하므로 더 많은 곳에 사용할 수 있습니다.[4]

 

 '암호알고리즘사용제한' 제거 설정

- [참고8]에서 정책 파일을 다운로드하고, zip 압축을 푼 후에, local_policy.jar, US_export_policy.jar 파일을 $JAVA_HOME/jre/lib/security 에 복사하면 됩니다. [6][7][8]

※ 자바암호패키지(JCA/JCE)는 JDK1.4이상에서 기본으로 포함되어 있기 때문에 별도의 설치 방법이나 활용 방법을 설명하지 않습니다.


 

 

이번 글에서는 JAVA에서 기본으로 지원하는 암호 패키지인 JCA와 JCE에 대해서 알아보았습니다. 기본적인 키생성, 암호화, 전자서명 등은 JCA/JCE로 가능합니다. 하지만 JDK별로 호환이 안 되는 경우가 있고, 많은 알고리즘을 지원하지 않기 때문에 BouncyCastle 등의 암호 패키지를 사용하는 것이 좋겠습니다.


 

 

참고 목록

[1] https://en.wikipedia.org/wiki/Java_Cryptography_Architecture

[2] http://docs.oracle.com/javase/8/docs/technotes/guides/security/crypto/CryptoSpec.html

[3] https://blog.idrsolutions.com/2016/08/which-security-implementation-should-i-use-bouncy-castle-or-jca/

[4] http://bouncycastle.org/specifications.html

[5] https://en.wikipedia.org/wiki/Export_of_cryptography_from_the_United_States

[6] http://opensourceforgeeks.blogspot.kr/2014/09/how-to-install-java-cryptography.html

[7] http://docs.oracle.com/javase/8/docs/technotes/guides/security/SunProviders.html#importlimits

[8] http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html

 

 

문서 이력

- v1.00(2016.09.01) : 최초 등록

반응형
Posted by ITBJ
IT/Security2017. 2. 9. 18:51

이 글에서는 오픈소스 소프트웨어 암호 라이브러리 종류와 특징에 대해서 알아보고, 실무에서 효과적으로 사용할 수 있는 암호 라이브러리에 대해서 알아보겠습니다.


 오픈소스 암호 라이브러리 종류 및 특징


Implementation

Software License

Development Language

FIPS 140-2 mode

Botan

Simplified BSD

C++

No

Bouncy Castle

MIT License

Java

No

Crypto++

Boost Software License 1.0, while the individual files in the compilation are all public domain

C++

Yes

libsodium

ISC license

C

No

OpenSSL

Apache Licence 1.0 or 4-Clause BSD Licence

C

No

Libgcrypt

GNU LGPL v2.1+

C

Yes

cryptlib

Sleepycat License and commercial license

C

Yes

Nettle

GNU GPL v2, GNU LGPL v3

C

No

wolfCrypt

GPL v2 and commercial license

C

Yes

[표1] 오픈소스 암호 라이브러리 종류 및 특징 [1]

 

1) 라이선스


[표1]은 '위키디피아 오픈소스 암호 라이브러리 비교 사이트'[1]에서 핵심적인 내용만 발췌한 것입니다. 보시면 아시겠지만, 오픈소스 암호라이브러리를 사용할 때 우선적으로 고려해야 하는 것은 '소프트웨어 라이선스' 입니다. 왜냐하면 '오픈소스 소프트웨어 라이선스'는 그 종류에 따라 관련 소프트웨어의 소스코드를 공개해야 하는 의무가 있기 때문입니다. (예를 들면, A라는 네트워크 프로그램을 개발하여 서비스하고 있었는데, 일부 암호 기능이 필요해서, GPL 라이선스를 가진 오픈소스 암호라이브러리를 포함(링킹)하여 프로그램을 수정하고 배포하였다면, A라는 네트워크 프로그램 전체 소스코드를 공개해야 합니다. 회사의 핵심 자산인 소스코드를 모두 공개해야 될 수 도 있습니다.)


따라서 오픈소스 소프트웨어에서 요구하는 의무사항 중에서 '소스코드 공개 의무'는 확실히 확인해야 합니다. [표1]에서 보시면 노란색으로 표시된 라이선스(Simplified BSD, MIT License, Boost Software License 1.0, ISC license, Apache Licence 1.0, 4-Clause BSD Licence)는 '소스코드 공개 의무'가 없습니다. 하지만 빨간색으로 표시된 라이선스(Sleepycat License, GNU GPL v2)는 해당 오픈소스와 같이 패키징(소스코드 포함, 수정, 링킹)된 제품의 모든 소스코드를 공개해야 합니다. 녹색으로 표시된 LGPL 라이선스는 라이브러리를 동적 링킹(DLL)하여 사용하면 '소스코드 공개 의무'가 없습니다.


여기서 GPL, LGPL, MPL, BSD, Apache 라이선스 등을 비교하여 '소스코드 공개 의무'에 대해 자세히 알아보겠습니다.


종류

배포 시 소스코드 공개 의무 대상

기타

GPL

- 수정된 OSS(Open Souce Software) 소스코드
- 라이브러리 링킹(정적 또는 동적)한 프로그램의 소스코드
- 동일한 프로그램 파일에 포함 시 프로그램 소스코드
- 공유주소 영역 사용 시 프로그램 소스코드
- 플러그인 동적 링킹 시 프로그램 소스코드

* 파이프, 소켓, 커맨드라인 입력값, 독립적 호출(fork, exec)인 경우는 공개 의무 없음

LGPL

- 수정된 OSS 소스코드
- 정적(Static) 링킹한 응용프로그램 오브젝트 파일

* 동적(DLL) 링킹한 경우는 공개 의무 없음

MPL

- 수정된 OSS 소스코드

  

BSD License

없음

  

Apache License

없음

  

Affero GPLv3

- 서버에서 실행되는 소프트웨어 소스코드

* 클라우드서비스(SaaS 등)도 서버의 관련 소스코드를 공개해야 함 [3]

[표2] 오픈소스 소프트웨어 라이선스 소스 코드 공개 의무 [2]


위 [표2]를 보시면 GPL 라이선스는 완전 독립적(파이프, 소켓, 커맨드라인 입력값, fork, exec)으로 사용하지 않는 한 배포하는 프로그램의 소스코드를 모두 공개해야 합니다. 따라서 GPL 라이선스의 오픈소스는 독립적으로 사용이 가능하거나 또는 프로그램을 배포하지 않고 내부적으로 사용할 때에만 소스코드 공개 의무가 없습니다.


LGPL 라이선스는 수정된 OSS소스코드와 정적(Static) 링킹한 프로그램의 오브젝트 파일을 공개해야 합니다. 동적(DLL) 링킹한 경우는 공개 의무가 없습니다. 따라서 LGPL 라이선스도 대부분의 개발에서 라이선스 위반 없이 소스코드를 공개하지 않아도 충분히 활용할 수 있습니다.


MPL 라이선스는 수정된 OSS 소스코드만 공개하면 되고, BSD 라이선스, Apache 라이선스는 공개 의무가 없습니다.

이렇듯 오픈소스 소프트웨어를 사용해서 배포할 경우에, '소스코드 공개 의무'를 가지는데, AGPL(Affero GPLv3) 라이선스는 소프트웨어를 배포하지 않고 서버에서만 구현하여 동작하더라도 서버 프로그램의 소스코드를 모두 공개하도록 요구하고 있습니다. AGPL라이선스는 특히 주의해야 합니다.


[그림1] 오픈소스 소프트웨어 '소스코드 공개 의무' 설명도


[그림1]을 보시면 LGPL, MPL, BSD, Apache 라이선스가 자사의 프로그램 소스코드를 공개하지 않고 오픈소스를 사용할 수 있음을 쉽게 알 수 있습니다. GPL, APGL의 경우에는 오픈소스를 사용하면 자사의 프로그램까지 GPL, AGPL 라이선스 바뀌고 소스코드를 공개해야 함을 알 수 있습니다.

따라서 오픈소스 암호 라이브러리의 라이선스를 고려하면 Botan, Bouncy Castle, Crypto++, libsodium, OpenSSL, Libgcrypt 등이 용이하게 사용할 수 있는 오픈소스 암호 라이브러리라고 할 수 있습니다.

 

2) 개발 언어


두 번째 고려사항은 개발 언어 입니다. 자사 프로그램의 개발 언어를 고려하여 '오픈소스 암호 라이브러리'를 선택하시면 되겠습니다. [표1]에서 보시면 Java를 지원하는 라이브러리는 Bouncy Castle이 유일함을 알 수 있습니다. 물론 JNI(Java Native Interface)를 사용해서 C언어 라이브러리를 Java로 사용할 수 있게 할 수는 있지만 시간과 인력이 필요하겠습니다. 자사 프로그램이 Java로 구현되어 있다면 Bouncy Castle 라이브러리 사용하고, C++ 또는 C인 경우에는 다른 암호 라이브러리를 사용하면 되겠습니다.

추가적으로 아마존에서는 OpenSSL을 단순하게 만든 'S2N'이라는 C언어 암호 라이브러리를 배포하고 있습니다. [4][5] 또한 아마존 'AWS Encryption SDK for java'를 제공하고 있습니다. [6] Apache2.0 라이선스를 따르고 있습니다. 아마존 AWS 서비스를 사용하거나 단순하게 구현하고자 할 때 고려할 수 있겠습니다.

또한 구글에서 공개한 오픈소스 암호 라이브러리 'keyczer' 라는 라이브러리도 있습니다. Python, Java, C++을 지원하기 때문에 Python등 으로 구현하고자 할 때 고려할 수 있겠습니다. Apache 2.0 라이선스를 따릅니다. [7]

이 외에도 운영체제 또는 프로그래밍 언어 등에서 기본으로 제공하는 암호 라이브러리 들이 있습니다. 성능과 호환성, 관리 용이성, 개발 용이성 등을 고려하여 암호 라이브러리를 선택해야 하겠습니다.

 

3) 안전성


오픈소스 암호 라이브러리의 안전성 관련해서는 FIPS-140-2 인증을 받았는지 고려해야 합니다. [8] [9] [10] FIPS-140-2는 미국립표준기술연구소(NIST)와 캐나다통신보안국(CSE)에서 만든 '암호모듈에 대한 보안 요구 사항'입니다. 참고 [8]에 인증 받은 기업 목록과 제품명을 확인할 수 있습니다.(Libgcrypt는 Redhat에서 인증 받은 것임을 알 수 있습니다.) 따라서 위 목록에 포함된 제품이면 안정성이 검증된 제품이라고 할 수 있습니다.

국내에서는 국가정보원에서 관리하는 '암호모듈 검증기준'(KS X ISO/IEC 19790)이 있습니다. (KCMVP, 'Cryptographic Module Validation Program' 라고 합니다.) 검증 기준 대상은 국산암호알고리즘(ARIA, SEED, LEA, HIGHT)을 기준으로 관련 해시 알고리즘, 전자서명 알고리즘 등이 대상입니다. 국가∙공공기관은 인증 받은 국산 암호 알고리즘 라이브러리를 사용해야 하기 때문입니다. [11]


(주)LG CNS, (주)NSHC, (주)드림시큐리티, (주)라온시큐어, (주)마크애니, (주)비티웍스, (주)샤코시스템, (주)시큐브, (주)시큐아이, (주)웹케시이노밸류, (주)윈스, (주)유넷시스템, (주)유비앤티스랩, (주)유비엠정보, (주)유비즈코아, (주)잉카인터넷, (주)케이사인, (주)케이엘매트릭스, (주)코스콤, (주)파수닷컴, (주)퓨쳐시스템, (주)한국무역정보통신, (주)한국전자인증, (주)한국정보인증, (주)한컴시큐어, 리턴트루(주), 이니텍(주), 킹스정보통신(주), 펜타시큐리티시스템(주), 한국전력공사, 고려대학교, 국민대학교

[표3] 국가 암호 검증 라이브러리 인증 업체


[표3]에서 보는 바와 같이 현재 32개 회사 또는 기관이 암호 라이브러리 검증을 받은 상태입니다. [11] 국가∙공공기관은 기관간 통신을 위해서는 기준('국가∙공공기관 암호 사용 기준', 대외비)에 따라 국산암호알고리즘과 인증된 제품을 사용해야 합니다. 또는 KISA에서 배포하는 국산암호알고리즘 소스코드를 이용해서 라이브러리를 구현하여 인증을 받아야 합니다. [12] 하지만 이 방법은 시간과 비용이 필요 합니다. 최근에 검증 기준 대상이 단순화 되어 이전보다 빠르게 인증을 받을 수 있겠으나 확인이 필요하겠습니다.


그리고 국가∙공공기관이라 하더라도 대외적인 업무에 상호 연동을 위해서는 AES 등 국제표준암호 알고리즘을 사용해야 할 수 있습니다. 이 경우에는 '오픈소스 암호 라이브러리'를 사용할 수 있고, FIPS-140-2 인증을 받은 라이브러리를 사용하는 것이 좋겠습니다.


일반 회사의 경우에도 FIPS-140-2 검증을 받은 '오픈소스 암호 라이브러리'를 사용하는 것이 더 안전하겠습니다만, FIPS-140-2 인증을 받지 않았다고 해서 '안전하지 않다'고 말할 수 없습니다. 인증을 받지 않은 오픈소스도 많은 사용자들의 참여로 안전성이 확보되어 있으며, 추가적인 보안 방법(wrapping 등)으로 안전하게 사용할 수 있습니다.

 

4. 지원 알고리즘 및 하드웨어 [1]

 

Implementation

EDH 

DH 

DSA 

RSA 

NTRU 

DSS 

ECC 

wolfCrypt 

Yes 

Yes 

Yes 

Yes 

Yes 

Yes 

Yes 

cryptlib 

Yes 

Yes 

Yes 

Yes 

No 

Yes 

Yes 

Libgcrypt 

Yes

Yes 

Yes 

Yes 

No 

Yes 

Yes 

Bouncy Castle 

No 

Yes 

Yes 

Yes 

Yes 

No 

Yes 

Crypto++ 

Yes 

Yes 

Yes 

Yes 

No 

No 

Yes 

Nettle 

No 

No 

Yes 

Yes 

No 

No 

Yes 

libsodium 

No 

No 

Yes 

No 

No 

No 

Yes 

[표4] Key generation and exchange


[표4]에서는 지원하는 '키 생성 및 교환 알고리즘'을 보여주고 있습니다. 많이 사용하는 알고리즘은 DH, DSA, RSA, ECC 등 입니다.

 

Implementation

MD5 

SHA-1 

SHA-2 

SHA-3 

RIPEMD-160 

Botan 

Yes 

Yes 

Yes 

Yes 

Yes 

Bouncy Castle 

Yes 

Yes 

Yes 

Yes 

Yes 

Crypto++ 

Yes 

Yes 

Yes 

Yes 

Yes 

OpenSSL 

Yes 

Yes 

Yes 

Yes 

Yes 

Libgcrypt 

Yes 

Yes 

Yes 

Yes 

Yes 

cryptlib 

Yes 

Yes 

Yes 

Yes 

Yes 

wolfCrypt 

Yes 

Yes 

Yes 

Yes 

Yes 

Nettle 

Yes 

Yes 

Yes 

Yes 

Yes 

libsodium 

No 

No 

Yes 

No 

No 

[표5] Hash functions


[표5]에서는 지원하는 해시 함수를 보여주고 있습니다. 많이 사용하는 알고리즘은 MD5, SHA-1, SHA-2, REPEMD-160 등 입니다.

 

Implementation

HMAC-MD5 

HMAC-SHA1 

HMAC-SHA2 

Botan 

Yes 

Yes 

Yes 

Bouncy Castle

Yes 

Yes 

Yes 

cryptlib 

Yes 

Yes 

Yes 

Crypto++ 

Yes 

Yes 

Yes 

Libgcrypt 

Yes 

Yes 

Yes 

Nettle 

Yes 

Yes 

Yes 

wolfCrypt 

Yes 

Yes 

Yes 

libsodium 

No 

No 

Yes 

[표6] HMAC algorithms


[표6]에서는 지원하는 HMAC 알고리즘을 보여주고 있습니다. 대부분 지원을 하기 때문에 문제 없겠습니다.

  

Implementation

AES-128 

AES-192 

AES-256 

AES-CBC 

AES-ECB 

AES-GCM 

AES-CCM 

AES-CTR 

3DES CBC 

Blowfish 

cryptlib

Yes 

Yes 

Yes 

Yes 

Yes 

No 

No 

Yes 

Yes 

Yes 

Crypto++

Yes 

Yes 

Yes 

Yes 

Yes 

Yes 

Yes 

Yes 

Yes 

Yes 

Libgcrypt 

Yes 

Yes 

Yes 

Yes 

Yes 

Yes 

Yes 

Yes 

Yes 

Yes 

Nettle 

Yes 

Yes 

Yes

Yes 

Yes 

Yes 

Yes 

Yes 

Yes 

Yes 

wolfCrypt 

Yes 

Yes 

Yes 

Yes 

Yes 

Yes 

Yes 

Yes 

Yes 

No 

Bouncy Castle[16] 

Yes 

Yes 

Yes 

Yes 

No 

Yes 

Yes 

Yes 

Yes 

Yes 

libsodium 

Yes 

No 

Yes 

No 

No 

Yes 

No 

Yes 

No 

No 

[표7] Block ciphers


[표7]에서는 지원하는 블록 암호 알고리즘을 보여주고 있습니다. 많이 사용하는 알고리즘은 AES 와 3DES입니다.

 

Implementation

PKCS #11 device 

Intel AES-NI 

cryptlib 

Yes 

No 

Crypto++ 

No 

Yes 

Libgcrypt 

No 

Yes 

libsodium 

No 

Yes 

wolfCrypt 

No 

Yes 

[표8] Hardware-assisted support


[표8]에서는 하드웨어 지원 목록을 보여주고 있습니다. 관련 하드웨어 가속이나 장치 연동이 필요한 경우에 고려하면 되겠습니다.

 

Implementation

Supported Operating System 

Thread safe 

cryptlib 

AMX, BeOS, ChorusOS, DOS, eCOS, FreeRTOS/OpenRTOS, uItron, MVS, OS/2, Palm OS, QNX Neutrino, RTEMS, Tandem NonStop, ThreadX, uC/OS II, Unix (AIX, FreeBSD, HPUX, Linux, OS X, Solaris, etc.), VDK, VM/CMS, VxWorks, Win16, Win32, Win64WinCE/PocketPC/etc, XMK

Yes 

Crypto++ 

Unix (OpenBSD, Linux, OS X, etc.), Win32, Win64Android, iOS, ARM

  

Libgcrypt 

All 32 and 64 bit Unix Systems (GNU/Linux, FreeBSD, NetBSD, MacOS X etc.), Win32, Win64, WinCE and more

Yes

libsodium 

OS X, Linux, OpenBSD, NetBSD, FreeBSD, DragonflyBSD, Android, iOS32 and 64-bit Windows (Visual Studio, MinGW, C++ Builder), NativeClient, QNX, Javascript, AIX, Minix, Solaris

Yes 

wolfCrypt 

Win32/64, LinuxMac OS XSolaris, ThreadX, VxWorks, FreeBSD, NetBSD, OpenBSD, embedded Linux, WinCE, Haiku, OpenWRT, iPhone (iOS), Android, Nintendo Wii and Gamecube through DevKitPro, QNX, MontaVista, NonStop, TRON/ITRON/µITRON, Micrium's µC/OS, FreeRTOS, SafeRTOS, Freescale MQX, Nucleus, TinyOS, HP/UX

Yes 

[표9] Portability


[표9]에서는 지원되는 운영체제를 보여주고 있습니다. UNIX, Windows 계열을 대부분 지원하며, 모바일(WinCE, Android, IOS) 운영체제 지원 여부도 확인을 해서 선택하면 좋겠습니다.

라이브러리의 특성에 따라 지원하는 알고리즘과 하드웨어가 조금씩 다른 것을 알 수 있습니다. 위 사항들을 고려하여 해당 프로젝트에 적합한 라이브러리를 선택해야 합니다.

wolfCrypt, cryptlib, Libgcrypt, Bouncy Castle, Crypto++ 암호 라이브러리는 다양한 알고리즘과 하드웨어를 지원하는 것을 알 수 있습니다. lisodium 암호 알고리즘은 많은 알고리즘을 지원하지는 않지만 경량화되어 있다고 볼 수 있습니다.

 

5. 사용 용이성 [1]

 

Implementation

Source Code Size(kSLOC = 1000 lines of source code) 

Code Lines to Comment Lines Ratio 

Bouncy Castle 

1359 

5.26 

cryptlib 

241 

2.66 

Crypto++ 

159 

10.1 

Libgcrypt 

216 

6.27 

Nettle 

111 

4.08 

libsodium 

14 

16

wolfCrypt 

39 

5.69 

[표10] Code Size


[표10]은 소스코드의 크기와 소스코드 비율을 보여줍니다. Bouncy Castle라이브러리가 소스코드 크기가 가장 크고, Crypto++와 libsodium 라이브러리가 소스코드에 비해 설명이 적은 것을 알 수 있습니다. 소스코드 크기가 크면 개발 시 복잡성이 증가하고, 설명이 적으면 이해도가 떨어지기 때문에 적절히 선택하면 좋겠습니다.


참고 목록

[1] https://en.wikipedia.org/wiki/Comparison_of_cryptography_libraries

[2] http://korea.gnu.org/people/chsong/copyleft/osswlg.pdf

[3] https://www.olis.or.kr/ossw/license/license/detail.do?lid=1069&mapcode=010068&currentPage=

[4] https://blogs.aws.amazon.com/security/post/TxCKZM94ST1S6Y/Introducing-s2n-a

[5] https://github.com/awslabs/s2n

[6] https://aws.amazon.com/ko/blogs/korea/how-to-use-the-new-aws-encryption-sdk-to-simplify-data-encryption-and-improve-application-availability/

[7] https://github.com/google/keyczar

[8] http://csrc.nist.gov/groups/STM/cmvp/documents/140-1/1401vend.htm

[9] http://csrc.nist.gov/publications/PubsFIPS.html

[10] http://meshnet.co.kr/index.php?pgurl=board/bd_write&brno=25&member=&mode=V&wrno=208&page=1&head=&stype=&skey=

[11] http://www.nis.go.kr/AF/1_7_3_2.do

[12] https://seed.kisa.or.kr/iwt/ko/index.do



반응형
Posted by ITBJ