알파채널 개념을 개발한 토마스 포터와 톰 더프의 이름을 따서 만들었다.

 

대상(렌더링 대상의 콘텐츠)을 사용하여

소스(렌더 할 그래픽 개체)의 합성 결과 색상을 계산하는 방법으로

12개의 합성 연산자로 구성되어 있다.

 

 

 

 

 

구현해보기

 

        private fun drawPorterDuffSample(canvas: Canvas) {
            val sampleBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888)
            val sampleCanvas = Canvas(sampleBitmap)
 
            sampleCanvas.drawBitmap(getCircleBitmap(), 0f, 0f, Paint())
            sampleCanvas.drawBitmap(getRectangleBitmap(), 0f, 0f, Paint().apply {
                xfermode = PorterDuffXfermode(PorterDuff.Mode.SRC)
            })
 
            canvas.drawBitmap(sampleBitmap, 0f, 0f, Paint())
        }
cs

 

 

canvas의 drawRect, drawCircle과 같은 메소드에 적용하면 기대와 다른 결과가 나온다.

SRC, DST 모두 Bitmap으로 사용해야 기대한 결과를 볼 수 있었다.

 

위 코드에서 rectangleBitmap이 SRC, circleBitmap이 DST가 된다.

  

 

전체 코드

더보기
    class Renderer {
        private var width: Int = 0
        private var height: Int = 0
        private var centerX: Int = 0
        private var centerY: Int = 0
 
        fun setWidthAndHeight(width: Int, height: Int) {
            this.width = width
            this.height = height
            centerX = width/2
            centerY = height/2
        }
 
        fun onDraw(canvas: Canvas) {
            drawPorterDuffSample(canvas)
        }
 
        private fun drawPorterDuffSample(canvas: Canvas) {
            val sampleBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888)
            val sampleCanvas = Canvas(sampleBitmap)
 
            sampleCanvas.drawBitmap(getCircleBitmap(), 0f, 0f, Paint())
            sampleCanvas.drawBitmap(getRectangleBitmap(), 0f, 0f, Paint().apply {
                xfermode = PorterDuffXfermode(PorterDuff.Mode.SRC)
            })
 
            canvas.drawBitmap(sampleBitmap, 0f, 0f, Paint())
        }
 
        private fun getCircleBitmap() = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888).apply {
            val canvas = Canvas(this)
            val paint = Paint().apply {
                flags = Paint.ANTI_ALIAS_FLAG
                color = Color.parseColor("#E9B639")
            }
            val radius = width*3.5f/10
 
            canvas.drawCircle(radius, radius, radius, paint)
        }
 
        private fun getRectangleBitmap() = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888).apply {
            val canvas = Canvas(this)
            val paint = Paint().apply {
                flags = Paint.ANTI_ALIAS_FLAG
                color = Color.parseColor("#4899C5")
            }
            val startTop = width*3/10
            val endBottom = width*9/10
 
            canvas.drawRect(
                Rect(startTop, startTop, endBottom, endBottom),
                paint
            )
        }
 
    }
cs

 

 

 

 

 

 

결과

 

 

위에 코드를 안드로이드 커스텀뷰에서 그린 결과이다.

 

안드로이드 커스텀뷰 코드

더보기
class CustomView(context: Context, attrs: AttributeSet?, defStyle: Int) : View(context, attrs, defStyle) {
    constructor(context: Context) : this(context, null0)
    constructor(context: Context, attrs: AttributeSet?) : this(context, attrs, 0)
 
    private val renderer = Renderer()
 
    override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec)
        renderer.setWidthAndHeight(measuredWidth, measuredHeight)
    }
 
    override fun onDraw(canvas: Canvas) {
        renderer.onDraw(canvas)
    }
 
    class Renderer {
        private var width: Int = 0
        private var height: Int = 0
        private var centerX: Int = 0
        private var centerY: Int = 0
 
        fun setWidthAndHeight(width: Int, height: Int) {
            this.width = width
            this.height = height
            centerX = width/2
            centerY = height/2
        }
 
        fun onDraw(canvas: Canvas) {
            drawPorterDuffSample(canvas)
        }
 
        private fun drawPorterDuffSample(canvas: Canvas) {
            val sampleBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888)
            val sampleCanvas = Canvas(sampleBitmap)
 
            sampleCanvas.drawBitmap(getCircleBitmap(), 0f, 0f, Paint())
            sampleCanvas.drawBitmap(getRectangleBitmap(), 0f, 0f, Paint().apply {
                xfermode = PorterDuffXfermode(PorterDuff.Mode.SCREEN)
            })
 
            canvas.drawBitmap(sampleBitmap, 0f, 0f, Paint())
        }
 
        private fun getCircleBitmap() = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888).apply {
            val canvas = Canvas(this)
            val paint = Paint().apply {
                flags = Paint.ANTI_ALIAS_FLAG
                color = Color.parseColor("#E9B639")
            }
            val radius = width*3.5f/10
 
            canvas.drawCircle(radius, radius, radius, paint)
        }
 
        private fun getRectangleBitmap() = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888).apply {
            val canvas = Canvas(this)
            val paint = Paint().apply {
                flags = Paint.ANTI_ALIAS_FLAG
                color = Color.parseColor("#4899C5")
            }
            val startTop = width*3/10
            val endBottom = width*9/10
 
            canvas.drawRect(
                Rect(startTop, startTop, endBottom, endBottom),
                paint
            )
        }
 
    }
 
}
cs

 

 

 

 

 

참고

 

https://ko.wikipedia.org/wiki/%EC%95%8C%ED%8C%8C_%EC%B1%84%EB%84%90

 

알파 채널 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전.

ko.wikipedia.org

 

https://developer.android.com/reference/android/graphics/PorterDuff.Mode

 

PorterDuff.Mode  |  Android 개발자  |  Android Developers

 

developer.android.com

 

 

 

'Common' 카테고리의 다른 글

암호화와 해시  (0) 2020.06.19
Git 기본 명령어  (0) 2019.08.19
Android Studio/IntelliJ 단축키 (Window)  (0) 2019.08.17
시간 표시  (0) 2019.06.16

 

 

 

 

안드로이드를 하다보면 MD5, SHA1, SHA-256과 같은 것들을 필연적으로 접하게 된다.

릴리즈 APK를 만들 때 .jks 확장자인 키스토어가 필요하다.

AWS 서버를 만들면 확장자가 pem인 파일을 받아야 한다.

공인인증서는 .der, .pfx와 같은 확장자로 쓰인다.

 

위에 것들을 무엇인지 알기 위해서는 해시함수, 대칭키, 공개키, 인증서 등을 알아야 한다.

 

간략하게 각각의 목적을 보자면

 

해시함수는 유일하게 식별할 수 있는 값을 만드는 함수이고

대칭키와 공개키는 데이터를 안전하게 전달하기 위해 암복호화를 위해 만들어졌다.

인증서는 자신을 증명하기 위해 사용된다.

 

 

 


 

해시함수

대상을 식별할 수 있는 해시값을 만드는 함수이다.

 

해시값의 크기와 해시함수에 따라 충돌이 일어날 수도 있지만

사용하는 대부분의 알고리즘은 유일하게 식별할 수 있게 만든다.

 

해시의 사용

1. HashMap과 같이 대상을 찾기 위한 키값으로 사용

2. 원본 데이터를 보장하기 위한 체크섬으로 사용

 

 

MD5(Message-Digest algorithm 5)

128비트 암호화 해시 함수

주로 프로그램이나 파일이 원본 그대로인지를 확인하는 무결성 검사 등에 사용.

임의의 길이의 메시지를 입력받아, 128비트짜리 고정 길이의 출력값을 낸다.

현재는 결함으로 인해 보안관련 용도로 쓰이는 것을 권장하지 않음.

 

SHA(Secure Hash Alogorithm)

암호화 해시 함수

최초의 SHA 알고리즘을 SHA-0라고 한다.

SHA-1은 SHA-0의 변형으로 TLS, SSL, PGP, SSH 등 많은 보안 프로토콜과 프로그램에 사용된다.

SHA-2 4종류의 변형(SHA-224, SHA-256, SHA-384, SHA-512) 통칭

 

 

 


 

암호화

 

대칭키

암호화와 복호화에 하나의 키를 사용하는 암호화 방식

하나의 키를 사용하기 때문에 키 노출시 암호화가 무의미해진다.

DES, 3DES, AES...

 

DES(Data Encryption Standard)

블록 암호의 일종, 미국 NBS에서 국가 표준으로 정한 암호

56비트의 키를 사용
3DES : DES를 세번 중첩해 만듬

 

AES(Andvanced Ecryption Standard)

DES를 대체해서 사용 중이다.

 

 

 

비대칭키(공개키)

암호화는 공개키를, 복호화는 비밀키를 사용하는 암호화 방식

누구나 암호화할 수 있지만 내용은 비밀키를 가지고 있는 사람만 볼 수 있다.

대칭키와 비교하면 매우 오래 걸린다.

RSA...

 

RSA

1024, 2048 비트의 키를 사용하며 소인수 분해를 이용한 암호화 알고리즘

기존의 알고있던 비대칭키와 반대로 비밀키로 암호화하고 공개키로 복호화가 가능하다.

 

비밀키를 암호화에 사용하면 나만 암호문을 만들 수 있다.

그렇기 때문에 전자서명의 용도로 사용할 수 있다.

 

비밀키를 복호화에 사용하면 나만 상대의 암호문을 읽을 수 있다.

서버에서 공개키를 공유하고 유저들이 암호화한 값을 복호화하여 서버만 데이터를 볼 수 있도록 사용한다.

 

 

 


 

암호화 사용법

 

A와 B가 통신하고 싶다.

 

대칭키 사용

1. 대칭키를 사용한다면 한쪽에서 우선 대칭키를 보내고

2. 서로 대칭키를 이용해 암호화 복호화하며 통신한다.

Problem. 대칭키를 보내는 과정에서 키가 노출될 수 있다.

 

공개키 사용

1. 공개키의 경우 서로 공개키만 전달한다.

2. 서로의 공개키로 암호화해서 전달한다.

3. 전달받은 데이터를 각자의 개인키로 복호화 한다.

Problem. 공개키 방식은 대칭키에 비해 속도가 현저하게 느리다.

 

대칭키 + 공개키 사용

1. 서로에게 공개키를 보낸다.

2. 한쪽에서 공개키로 대칭키를 암호화해서 전달한다.

3. 다른 한쪽은 개인키로 복호화해 대칭키를 얻는다.

대칭키를 암호화해서 보내기 때문에 대칭키가 노출되지 않고

대칭키를 통해 통신함으로 좋은 성능을 얻을 수 있다.

 

 

 


SSL 암호화 방식

 

대칭키 + 공개키를 사용해 통신에 문제가 생겼다.

공개키를 얻는 과정 중 외부의 악의적(해커) 행위로 인해 공개키를 신뢰할 수 없게 되었다.

 

기본적으로 위의 대칭키 + 공개키 방식을 사용한다.

공개키를 전달하는 과정이 복잡해졌을 뿐이다.

공개키를 인증기관에 전달해 공개키를 포함한 인증서를 만들어

전달하여 공개키에 대한 신뢰성을 높였다.

 

 

 

 

1. 사이트는 사이트의 공개키CA(인증기관)에 등록한다.

2. 사이트의 공개키해싱하고 CA의 비밀키로 암호화한다. 이 암호화값을 디지털 서명이라고 한다. 그리고 발급대상, 발급대상의 공개키, 발급자, 발급자의 서명(2번의 암호화한 값) 정보를 가지고 있는 인증서를 만든다.

3. 만들어진 인증서를 서버에 전달한다.

 

 

 

4. 유저는 CA에서 CA의 공개키를 받아 브라우저에 보관하고 있는다.

5. 서버에 접속을 요청한다.

6. 서버에서 인증서를 받는다.

7. ( 인증서의 발급자 서명을 CA 공개키로 복호화한 값 )과 ( 인증서에 포함된 공개키를 해싱한 값 )을

비교해 동일하다면 신뢰성이 있는 공개키라고 판단

 

 

 

8. 인증서의 공개키를 이용해 대칭키를 암호화하고 싸이트는 복호화하여 대칭키를 얻는다.

9. 대칭키를 이용해 통신한다.

 

인증기관에 의해서 암호화하는 것은 암호화 대상을 숨기려는 의도보다는

인증기관의 공개키를 통해 복호화됨을 확인하여 신뢰성을 얻는 것이다.

 

 

SSL(Secure Sockets Layer)

종단간 전송된 데이터를 암호화하여 인터넷 연결 보안을 유지하는 표준 기술

SSL 인증서 파일 포멧 종류로 .pem, .crt, .cer, .csr, .der, .pfx, .p12, .key, .jks 등의 포멧이 있다.

TLS(Transport Layer Security)와 함께 거론되는데 방식은 동일하다.

넷스케이프에서 SSL1.0, SSL2.0, SSL3.0까지 개발했고 SSL3.0을 기초로 IETF에서 만든 것이 TLS이다.

현재는 SSL은 결함으로 인해 사용이 중지되었음으로 우리가 사용하는 SSL은 TLS이다.

TLS를 SSL이라고 부르는 것에 대해 약간의 논란?이 있는 것 같아 보인다.

정확히 알지는 못하지만 우분투를 리눅스라 부를지 우분투라 부를지정도의 문제라고 보인다.

 

HTTP + SSL -> HTTPS

FTP + SSL + SFTP

 

 

 


 

인증서

공개키 + 비밀키 소유자 정보

 

 

인증서에 들어가는 내용

 - 일련번호

 - 소유자

 - 서명 알고리즘

 - 발행자

 - 유효기간(시작)

 - 유효기간(끝)

 - 키 사용 목적

 - 공인 키

 - 서명 알고리즘

 - 서명

 

 

 


 

이해에 도움이 된 포스팅들

 

https://rsec.kr/?p=426

 

RSA 인증서 (Certification) 와 전자서명 (Digital Sign)의 원리

공개키 비밀키로 이루어지는 RSA 알고리즘을 이해. 인증서에 포함된 공개키의 무결성을 보증하는 인증서 체인 (Certificate Chain) 에 대한 설명무결성 보증시 사용되는 해쉬 (지문, Finger Print) 와 전자

rsec.kr

https://preamtree.tistory.com/38

 

[IT 기술면접 준비자료] 대칭키, 공개키 방식과 SSL(TLS)

 정보보호 관련 수업을 들으면, 가장 먼저 배우게 되는 내용이 SSL이다. 암호화의 기원, DES, AES와 같은 개요에 해당하는 내용은 생략하고, 바로 본론으로 들어가도록 하겠다.  대칭키(Symmetric Key)

preamtree.tistory.com

 

'Common' 카테고리의 다른 글

PorterDuff  (0) 2020.08.18
Git 기본 명령어  (0) 2019.08.19
Android Studio/IntelliJ 단축키 (Window)  (0) 2019.08.17
시간 표시  (0) 2019.06.16

 

저는 commit할 때, merge 후 conflict 해결할 때만 IDE에서 작업하고

나머지는 Terminal에서 명령어로 처리합니다.

정리한 명령어들은 필수적으로 사용하는 것 같습니다.

 

 


Git 프로젝트 시작

git init : 처음 깃 설정
git clone : 원격 저장소에서 로컬에 복사


git remote add origin [git address] : 원격 저장소 주소를 연결

 

 


변경 후 원경 저장소에 업로드

git add * : 모든 변경 파일에 대해 인덱스에 저장
git commit -m "commit description" : 커밋 

git push origin [branch name] : 원격 저장소에 없는 경우 원격 저장소에 올리기
git push : 원격 저장소에 업데이트

 

 


브랜치 관리

git branch : 로컬 브랜치 리스트
git branch -r : 원격 브랜치 리스트
git branch -a : 모드 브랜치 리스트

git checkout [branch name] : 변경
git checkout -b [branch name] : 만들고 변경
git checkout -t [branch name]

git branch -D [branch name] : 로컬 브랜치 삭제
git push origin :[branch name] : 원격 브랜치 삭제


git merge [branch name] : 현재 브랜치에 지정 브랜치를 합침

 

 


브랜치 복구, 변경사항 임시저장

git stash : 하던 작업 임시 저장
git stash pop : 저장했던 작업 복구

git reset --hard [commit key] : 커밋 당시 형상으로 복구
git reset --soft [commit key] : 커밋 당시로 HEAD는 이동하지만 변경 코드는 남아있음

 

저는 작업 브랜치를 실수해서 다른 브랜치에서 작업하고 커밋한 경우

git reset --soft [전 커밋] 으로 돌아가고

git stash

git checkout [코드가 붙어야할 브랜치]

git stash pop

git commit

이렇게 사용합니다.

 

 


원격 저장소에서 받아오기

git pull : 해당 브랜치 변경사항 받아오기
git fetch : 브랜치 정보 업데이트

 

 


기타

git tag [tag name] : 중요한 커밋에 태그를 붙여 표시한다.

보통 master branch 에 release branch를 합치고 표시하는 방식으로 쓴다. 아마?

'Common' 카테고리의 다른 글

PorterDuff  (0) 2020.08.18
암호화와 해시  (0) 2020.06.19
Android Studio/IntelliJ 단축키 (Window)  (0) 2019.08.17
시간 표시  (0) 2019.06.16

 

제가 주로 사용하는 단축키

정리하면서 추가적으로 필요해 보이는 단축키들로 정리했습니다.

 


일반

ALT + 1 : Project

ALT + 6 : Logcat

ALT + 9 : Version Control

ALT + F12 : Command 창

CTRL + ALT + S : IDE Settings

CTRL + ALT + SHIFT + S : Project Settings

CTRL + ALT + Y : 동기화

CTRL + SHIFT + F12 : 편집기 최대화/최소화

 

 


Studio 내에서 탐색 및 검색

SHIFT 두번 : 모든 항목 검색

CTRL + R : 바꾸기

CTRL + SHIFT + R : 전체 파일에서 바꾸기

CTRL + SHIFT + N : 파일 찾기

CTRL + F : 찾기

CTRL + SHIFT + F : 경로에서 찾기

CTRL + F12 : 파일 구조 팝업 열기

CTRL + F4 : 활성 편집창 탭 닫기

ALT + LEFT/RIGHT : 탭 이동

CTRL + ALT + LEFT/RIGHT : 이전/이후 커서로 이동

ESC : 도구 창에서 편집기 창으로 돌아가기

 

 


코드 쓰기

ALT + Insert : 거의 모든 생성

CTRL + O : 메서드 재정의

CTRL + I : 메서드 구현

CTRL + +/- : 코드 블록 접기/펼치기

CTRL + D : 선택 블록 복사

CTRL + Space : 기본 코드 완성

CTRL + Q : 빠른 문서 조회

CTRL + P : 매개변수 표시

CTRL + B : 선언/사용으로 이동

CTRL + / : 줄 주석

CTRL + SHIFT + / : 블록 주석

CTRL + W : 계속 증가하며 코드 블록 선택

CTRL + SHIFT + W : 현재 선택 블록에서 영역 감소

CTRL + [ : 코드 블록 시작으로 이동

CTRL + ] : 코드 블록 끝으로 이동

CTRL + ALT + O : import 최적화

CTRL + J : 스마트 선 이음

SHIFT + ENTER : 새 줄 시작

ALT + UP/DOWN : 블록 단위 이동

CTRL + SHIFT + UP/DOWN : 현재/선택 영역 줄 바꿈

F2 : 다음 강조 표시된 오류

 

 


빌드 및 실행

CTRL + F9 : 빌드

SHIFT + F10 : 현재 선택되어 있는 작업 실행

CTRL + SHIFT + F10 : 현재 커서가 있는 곳에서 작업 실행

ALT + SHIFT + F10 : 실행 가능한 리스트 표시

 

 


ETC

CTRL + K : Git Commit

 

 

 

'Common' 카테고리의 다른 글

PorterDuff  (0) 2020.08.18
암호화와 해시  (0) 2020.06.19
Git 기본 명령어  (0) 2019.08.19
시간 표시  (0) 2019.06.16

 

지구는 23시간 56분 4.091초 주기로 자전
지구는 태양을 365.2564 태양일 주기로 공전
 
UTC(협정 세계시; 프랑스어: Temps Universel Coordonné, 영어: Coordinated Universal Time)
 : 국제원자시와 윤초 보정을 기반으로 표준화된 국제 표준시

GMT(그리니치 평균시; Greenwich Mean Time)
 : 런던을 기점, 웰링턴을 종점으로 하는 협정 세계시의 빠른 시간

 

UTC는 세슘 원자의 진동 수를 기반으로 계산한다.

GMT는 지구 자전을 이용해 측정하고 지구의 자전이 늦어져 덜 정확하다.

 

TimeZone(시간대)

 :  영국의 그리니치 천문대를 기준으로 지역에 따른 시간의 차이, 다시 말해 지구의 자전에 따른 지역 사이에 생기는 낮과 밤의 차이를 인위적으로 조정하기 위해 고안된 시간의 구분선을 일컫는다.

 

 

DST(Daylight saving time; 서머타임 summer time)

 : 하절기에 표준시를 원래 시간보다 한 시간 앞 당긴 시간을 쓰는 것

실제 낮 시간과 사람들이 활동하는 낮 시간 사이의 격차를 줄이기 위해 사용한다.

ex) 09:00~18:00(DST 적용 시간) -> 08:00~17:00(실제 시간)

 

 

 

 


KOTLIN 코드, JAVA 라이브러리

 

val FORMAT_DATE = "yyyy-MM-dd HH:mm:ss"
val FORMAT_UTC = "yyyy-MM-dd'T'HH:mm:ssXXX"

private fun getLocalTime(
    locale: Locale = Locale.getDefault(),
    timeZone: TimeZone = TimeZone.getDefault()
): String {
    val date = Date()
    val simpleDateFormat = SimpleDateFormat(FORMAT_DATE, locale).apply {
        this.timeZone = timeZone
    }

    return simpleDateFormat.format(date)
}

private fun getUTCTime(
    locale: Locale = Locale.getDefault(),
    timeZone: TimeZone = TimeZone.getTimeZone("UTC")
): String {
    val date = Date()
    val simpleDateFormat = SimpleDateFormat(FORMAT_UTC, locale).apply {
        this.timeZone = timeZone
    }

    return simpleDateFormat.format(date)
}
    println(getLocalTime())
    println(getUTCTime())
    println(getLocalTime(timeZone = TimeZone.getTimeZone("America/New_York")))
    println(getUTCTime(timeZone = TimeZone.getTimeZone("America/New_York")))

 

결과 :

2020-01-05 16:08:58
2020-01-05T07:08:58Z
2020-01-05 02:08:58
2020-01-05T02:08:58-05:00

 

DST가 자동 적용되는지 확인 필요

 

 

 

 

'Common' 카테고리의 다른 글

PorterDuff  (0) 2020.08.18
암호화와 해시  (0) 2020.06.19
Git 기본 명령어  (0) 2019.08.19
Android Studio/IntelliJ 단축키 (Window)  (0) 2019.08.17

+ Recent posts