Quantcast
Channel: Make you feel cozy
Viewing all 46 articles
Browse latest View live

Keystore 및 Keychain 이용 암복호화 및 키생성 주요 내용

$
0
0

<주요 정리>

1. Keystore

- 안드로이드에서는 KeyGenParameterSpec.Builder에서 setUserAuthenticationRequired 옵션을 true로 설정하면 해당 키 사용시 추가 인증(지문 인증 등)이 요청된다.

- 이 경우, 인증장치 정보(지문 등) 삭제 또는 해제가 발생하면 해당 키를 비활성화되며 지문 인증시 반환되는 Cipher 객체를 이용하여 암호화 및 서명을 수행하므로 사용자의 승인 없이 Keystore 내 키 사용이 불가능하다.

- 지문 인증 삭제/추가 시 기존 Keystore내 모든 키가 비활성화되므로 지문 재인증을 통해 키정보를 새로 구축해야 한다.


2. iOS

- iOS에서 개인키 생성시 속성으로 kSecAttrIsPermanent를 true로 지정하면 keychain에 키가 자동으로 저장한다. (단, keychain 저장이 SecureEnclave 저장을 의미하는것은 아니다)

- iOS에서 SecKeyCreateRandomKey() 함수를 이용해 개인키 생성시 SecAttrTokenIDSecureEnclave를 설정하면 SecureEnclave에 개인키가 저장된다(단 EC-256bit 만 지원, iOS9 부터 지원)

- iOS에서 SecAccessControlCreateWithFlags의 옵션인 SecAccessControlCreateFlags에

  1) privateKeyUsage를 설정하면 SecureEnclave를 통해 서명이 가능하다. 설정안하면 서명이 안된다.

  2) userPresence를 설정하면 사용자 추가 인증이 있는 경우에만 서명이 가능하다. (단 이 경우 인증장치 정보(지문 등) 해제가 발생하면 해당 정보는 삭제된다)

 * SecItemAdd() 사용할때도 kSecAttrAccessible를 설정하여 touchID 사용을 강제화할 수 있다.

- iOS는 kSecAttrApplicationTag를 통해서 SecureEnclave의 개인키를 구별한다.

- iOS의 경우 지문 인증 해제시 데이터 삭제 또는 유지를 물어본다 

- FaceID는 해제시 별도 선택없이 데이터를 유지하므로 기존 얼굴 인증 데이터를 재사용이 가능하다.


<실제 구현 참고용 github 소스>

(iOS) https://github.com/trailofbits/SecureEnclaveCrypto

(Android) https://github.com/sitepoint-editors/AndroidFingerprintAPI


<키스토어와 지문인식 연동 방법>

- 지문인식 성공시 cipher 객체를 전달받아 암복호화 가능

public void onAuthenticationSucceeded(FingerprintManager.AuthenticationResult result) {

            Cipher cipher = result.getCryptoObject().getCipher();

            byte[] output;

            try {

                output = cipher.doFinal(input);

            } catch (IllegalBlockSizeException | BadPaddingException e) {

                throw new RuntimeException(e);

            }

            callback.done(output);

        }


<키체인 및 SecureEnclave 연동 세부 방법>

1. iOS Keychain은 Keychain과 Secure Enclave를 연동하기 위해서는 XXXthisDeviceOnly 옵션을 넣어야한다. 특히 서명용으로 사용하려면 privateKeyUsage 옵션을 추가하여야 한다

let access =

    SecAccessControlCreateWithFlags(kCFAllocatorDefault,

                                    kSecAttrAccessibleWhenUnlockedThisDeviceOnly,

                                    .privateKeyUsage,

                                    nil)!   // Ignore error


2. 또한 SecCreateRandomKey() 호출시 kSecAttrTokenIDSecureEnclave를 지정해야 SecureEnclave에 저장된다.

let attributes: [String, Any] = [

  kSecAttrKeyType as String:            type,

  kSecAttrKeySizeInBits as String:      256,

  kSecAttrTokenID as String:            kSecAttrTokenIDSecureEnclave,

  kSecPrivateKeyAttrs as String: [

    kSecAttrIsPermanent as String:      true,

    kSecAttrApplicationTag as String:   <# a tag #>,

    kSecAttrAccessControl as String:    access

  ]

]


guard let privateKey = SecKeyCreateRandomKey(attributes as CFDictionary, &error) else {

    throw error!.takeRetainedValue() as Error

}

3. 또한 userPresence 옵션을 추가하면 키체인 접근시 별도 인증(passcode, touch ID)를 받도록 제한할 수 있다.


* iOS 구현 참고자료

https://github.com/satyamtyagi/swiftcrypto

https://www.linkedin.com/pulse/ios-10-how-use-secure-enclave-touch-id-protect-your-keys-satyam-tyagi/


* 키생성시 접근제어 옵션 설정관련 객체 : kSecAttrAccessible, kSecAttrAccessControl 


----------------------------------------------------------------------------------------------------------------

* 가설1 : Keychain 항목은 SecureEnclave의 마스터키로 암호화된다

* 가설2 : 반면 안드로이드는 Keystore를 통해 키 생성시 키가 TZ영역에 저장되지 않고 일반영역에 저장된다. 단 PKEY의 생성을 TZ에서 수행하며 PKEY의 개인키 부분은 TZ를 통해 암호화되어 일반영역에 저장된다.(Qcom의 경우)

* 가설3 : 안드로이드는 암호화된 개인키를 유출할 수 있고, iOS는 그나마도 유출할 수 없다.(iOS 승?)

* 가설4 : 안드로이드는 암호화된 개인키를 TZ가 가져가서 복호화하고 서명을 수행할거 같다. 머 어째든 TZ에서 일어남은 동일하다.




iOS 암호화 및 서명 관련 함수 정리

$
0
0

<키생성>

SecKeyCreateRandomKey()

* 대칭키

// private key parameters

let privateKeyParams: [String: AnyObject] = [

    kSecAttrCanDecrypt as String:       true as AnyObject,

    kSecAttrIsPermanent as String:      true as AnyObject,

    ]           

// global parameters for our key generation

let parameters: [String: AnyObject] = [

    kSecAttrKeyType as String:          kSecMessECCKeyType,

    kSecAttrKeySizeInBits as String:    kSecMessECCKeySize as AnyObject,

    kSecAttrLabel as String:            kSecMessECCLabel as AnyObject,

    kSecPrivateKeyAttrs as String:      privateKeyParams as AnyObject

]

guard

let eCCPrivKey = SecKeyCreateRandomKey(parameters asCFDictionary, nil) else {

    print("ECC KeyGen Error!")

    return""

}

guard

let eCCPubKey = SecKeyCopyPublicKey(eCCPrivKey) else {

    print("ECC Pub KeyGen Error")

    return""

}

* 비대칭키

guard

let aclObject = SecAccessControlCreateWithFlags(

    kCFAllocatorDefault,

    kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly,

    .privateKeyUsage,

    nil

    ) else {

    print("could not create ACL error")

    return""

}

        

        

// private key parameters

let privateKeyParams: [String: AnyObject] = [

    kSecAttrAccessControl as String:    aclObject as AnyObject, //protect with touch id

    kSecAttrIsPermanent as String:      true as AnyObject,

]

        

        

// global parameters for our key generation

let parameters: [String: AnyObject] = [

    kSecAttrTokenID as String:          kSecAttrTokenIDSecureEnclave,

    kSecAttrKeyType as String:          kSecMessECCKeyType,

    kSecAttrKeySizeInBits as String:    kSecMessECCKeySize as AnyObject,

    kSecAttrLabel as String:            kSecMessECCSignLabel as AnyObject,

    kSecPrivateKeyAttrs as String:      privateKeyParams as AnyObject

]

        

        

guard

let eCCPrivKey = SecKeyCreateRandomKey(parameters asCFDictionary, nil) else {

    print("ECC KeyGen Error!")

    return""

}


guard

let eCCPubKey = SecKeyCopyPublicKey(eCCPrivKey) else {

    print("ECC Pub KeyGen Error")

    return""

}


<암호화>

SecKeyCreateEncryptedData

guard

let messageData = message.data(using: String.Encoding.utf8) else {

    print("ECC bad message to encrypt")

    return""

}        

guard

let encryptData = SecKeyCreateEncryptedData(

                  newPublicKey, 

                  SecKeyAlgorithm.eciesEncryptionStandardX963SHA256AESGCM, 

                  messageData as CFData, 

                  nil) else {

    print("pub ECC error encrypting")

    return""

}        

let encryptedData = encryptData as Data

let encryptedString = encryptedData.base64EncodedString(options: [])

print("pub encrypted string", encryptedString)

return encryptedString


<복호화>

SecKeyCreateDecryptedData

guard

let messageData = Data(base64Encoded: encryptedString, options: []) else {

    print("ECC bad message to decrypt")

    return""

}

        

guard

let decryptData = SecKeyCreateDecryptedData(

                  eCCPrivateKey!, 

                  SecKeyAlgorithm.eciesEncryptionStandardX963SHA256AESGCM, 

                  messageData asCFData, 

                  nil) else {

    print("priv ECC error decrypting")

    return""

}

        

        

let decryptedData = decryptData asData


guard

let decryptedString = String(data: decryptedData, encoding: String.Encoding.utf8) else {

    print("ECC decrypt could not get string")

    return""

}

        

print("priv ECC decrypted string", decryptedString)

return decryptedString


<서명>

SecKeyCreateSignature()

guard

let messageData = message.data(using: String.Encoding.utf8) else {

    print("bad message to sign")

    return""

}


//finger print proteted SHA256 X 96

guard

let signData = SecKeyCreateSignature(

               eCCSignPrivateKey!, 

               SecKeyAlgorithm.ecdsaSignatureMessageX962SHA256, 

               messageData asCFData, nil) else {

    print("priv ECC error signing")

    return""

}

        

//convert signed to base64 string

let signedData = signData as Data

let signedString = signedData.base64EncodedString(options: [])

print("priv signed string", signedString)

return signedString


SecKeyVerifySignature()

guard

let messageData = message.data(using: String.Encoding.utf8) else {

    print("ECC bad message to verify")

    returnfalse

}

        

guard

let signatureData = Data(base64Encoded: signatueString, options: []) else {

    print("ECC bad signature to verify")

    returnfalse

}

        

let verify = SecKeyVerifySignature(

             newPublicKey, 

             SecKeyAlgorithm.ecdsaSignatureMessageX962SHA256, 

             messageData as CFData, 

             signatureData as CFData, 

             nil)

return verify


안드로이드 Intent 사이즈 제약사항(feat. TransactionTooLargeException)

$
0
0

안드로이드에서 Intent에 1Mbyte 이상의 데이터를 넣으면 

android.os.TransactionTooLargeException 이 발생함


<참고>

https://developer.android.com/reference/android/os/TransactionTooLargeException.html



<해결방법>

1. 앱내 Activity 호출 인경우는 Intent에 데이터를 넣지 말고 static 클래스 변수(싱글톤)를 사용해서 Activity 간 데이터 공유


2. 앱간 Activity 호출 인경우는 파일을 이용하고, file path를 전송



리눅스 프로세스간 자료 교환(pipe,message queue, shared memory, memory map)

$
0
0

<자료 출처 : https://www.joinc.co.kr/w/Site/system_programing/Book_LSP/ch08_IPC>


pipe

named pipe

message queue

shared memory

memory map

semaphore

socket


<통신 기반 교환>

- pipe(파이프)

#include <unistd.h>


int pipe(int filedes[2]);

- named pipe

#include <sys/stat.h>


int main(int argc, char **argv)

{

  mknod(argv[1], S_IFIFO, 0);

  return 0;

}

- message queue(메시지 큐)

데이터 쓰기

#include <sys/types.h> 

#include <sys/ipc.h> 

#include <sys/msg.h> 

 

int msgsnd (int msqid, (void *)msgp, size_t msgsz, int msgflg) 

ssize_t msgrcv (int msqid, struct  msgbuf  *msgp,  size_t msgsz,  

                long msgtyp, int msgflg) 

데이터 읽기

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/msg.h>


int msgget(key_t key, int msgflg);


<메모리 공유 기반 교환>

- shared memory(공유 메모리)

공유 메모리를 잡고 쌍방간 데이터교환(32M~1G까지 가능)

#include <sys/types.h>

#include <sys/shm.h>


int shmget(key_t key, int size, int shmflg)

void *shmat( int shmid, const void *shmaddr, int shmflg )

int shmdt( const void *shmaddr)

int shmctl(int shmid, int cmd, struct shmid_ds *buf)

- memory map(메모리맵)

파일을 메모리에 매핑시켜 데이터 교환

메모리 변경 내용이 파일로 곧바로 저장되는 장점이 있음

#include <sys/mman.h>


void *mmap(void *addr, size_t length, int prot, int flags,

       int fd, off_t offset);

- semaphore(세마포어)

데이터 교환 보다는 접근통제 용도로 쓰임

하나의 자원의 여러개의 프로세스가 동시 작업하지 못하게 임계영역을 생성해줌

#include <sys/types.h> 

#include <sys/ipc.h> 

#include <sys/sem.h> 

 

int semget(key_t key, int nsems, int semflg); 

int semop (int semid, struct sembuf *sops, unsigned nsops); 

int semctl(int semid, int semnum, int cmd, union semun arg);

- socket(소켓)

TCP, UDP 등 통신 프로토콜을 이용해서 데이터 교환




GDPR 및 PSD2 개요

$
0
0

출처: http://blog.fasoo.com/221218750555


[GDPR] 

1. 개요

- 유럽연합의 개인정보보호법, General Data Protection Regulation


2. 주요 내용

1) 사전 동의(Consent)

EU 거주자에 대해 개인별로 식별 가능한 정보를 수집, 저장, 처리하는 조직(=정보 관리자, Controller)은 정보 주체로부터 사전 동의를 받아야 합니다. 동의를 구할 때에는 간략하고, 명확하고, 모든 법률적, 전문적 용어를 빼고 쉽게 어떤 정보 처리를 위해 어떤 동의가 필요하다는 것을 명확하게 설명해야 합니다.


2) 정보 수집, 처리 기록(Records of processing activities)

정보 주체로부터 개인정보를 수집하는 모든 조직은 어떤 목적에서 정보를 수집하고 있는지, 무슨 이유로 어떻게 해당 정보를 사용하거나 처리할 것이며 누구와 공유할 것인지 반드시 기록으로 남겨야 합니다.


3) 정보 침해 공지(Data breach notification)

정보 관리자는 개인정보 및 보안에 위협이 될 만한 모든 침해 사실에 대해 정보 주체에게 공지할 의무가 있습니다. 이 같은 공지는 침해 사실이 발견된 지 72시간 내에 전달되어야 합니다. 또한 정보 관리자를 위해 정보를 처리하는 모든 조직(=정보 처리자, Processor)은 모든 침해 사실에 대해 정보 관리자에게 지체 없이 알려야 합니다. 그리고, 기업은 자국의 정보 보호 당국에도 침해 사실을 보고하도록 규정합니다. 단, 특정한 경우 공지 의무에서 면제될 수 있습니다. 특정 경우란 정보가 암호화 되어 있거나, 가명 처리 등 비식별화된 경우를 말합니다. 침해된 정보로 각 개인의 신원을 직접적으로 밝힐 수 없거나 침해 발생 이후라도 신원 정보가 드러나는 것을 막기 위한 추후 조치를 했다면, 반드시 공지해야 할 의무는 없습니다.


4) 정보 보호를 위한 기술적, 조직적 조치(Data protection by design and by default)

EU 거주자의 정보를 다루는 조직은 제품과, 서비스를 계획하는 기본 단계부터 개인 정보 보호를 포함하고 전체 라이프 사이클 전반에 걸쳐 개인정보를 보호하는 것을 권장합니다. 개인 정보 침해를 막기 위한 조직적 절차나 적절한 기술적 제어 등을 통해 사전에 조치하고, 시행할 의무가 있습니다. 정보 관리자는 특정 상황에서 개인 정보 영향 평가(Data protection impact assessment)를 시행하여야 합니다. 개인 정보의 노출, 도용 위험이 있는 신기술의 사용이나 특정 정보 처리를 하는 경우, 영향도를 사전에 예상하여 정보를 확인하는 사람이 누구든지 해당 정보의 주체를 바로 식별할 수 없는 형태로 정보를 가공하도록 권고합니다.


5) 정보 열람권(Right of access)

정보 주체는 자신과 관련한 정보 관리자가 가진 개인 정보에 대해 사본을 요구하고 확보할 수 있습니다. 조직은 요청을 받으면 각 개인에게 현재 어디서, 무슨 목적으로 처리되고 있는지에 대해 답변을 해야 합니다. GDPR은 조직이 어떤 개인 정보를 보유하고 있는지, 현재 어떻게 사용되고 있는지, 누구와 공유하고 있는지, 어디서 해당 개인 정보를 얻었는지 기록하기 위해 알기 쉽고 명확한 수단을 보유하라고 요구하고 있습니다.


6) 정보 이동권(Right to data portability)

EU 거주자는 자신의 개인 정보를 한 정보 관리자로부터 다른 정보 관리자로 이동시키라고 요구할 권리를 가집니다. 정보 관리자는 표준적이고, 기기가 읽을 수 있는 형태로 요구 받은 정보를 제공해야 하며, 이러한 요구에 대해 어떠한 요금도 책정해서는 안됩니다.


7) 정보 삭제권(Right to erasure)

정보 주체는 조직에게 자기 개인 정보를 삭제하도록 요구할 권리를 가집니다. 또한 정보 주체는 정보 관리자에게 자기 개인 정보를 제 3자에게 전파, 공유, 처리하는 것을 중지하라고 요청할 권리가 있습니다. 정보 삭제는 개인 정보가 특정 조건을 위해 더 이상 필요치 않은 상황이나, 정보 주체가 해당 정보의 사용에 대한 동의를 철회하는 모든 상황에서 요구됩니다.


8) DPO(Data protection officer)의 지정

조직은 데이터 보호 책임을 지는 데이터 보호 관리자를 지정할 의무가 있으며, 특히 공공기관인 경우 더욱 중요합니다. 지정된 데이터 보호 관리자는 정보 관리자와 정보 처리자에게 개인 정보 처리 시 GDPR에서의 의무를 공지 및 조언하고, 해당 의무를 준수하는지 규칙적이고 체계적인 모니터링을 통해 감시해야 합니다. 또한 데이터 보호 관리자는 개인 정보 처리를 포함한 여러 사안과 관련해 연락책 역할을 수행할 책임이 있습니다.

[PSD2]

1. 개요

- EU의 2차 지급결제서비스 지침(Payment Service Directive)

- 사용자 인증 절차 강화, 인증정보 관리 보안 강화, 신규서비스 활성화를 위한 오픈 API 구현을 의무화

- 세부 구현은 별도 제정하여 19.9월 시행


2. 주요 내용

- AISP, PISP의 의무규정 명문화

* 계정정보서비스(AISP, Account Information Service Provider) : 은행별 계좌 정보 제공 서비스

* 지급개시서비스(PISP, Payment Initiation Service Provider) : 은행간 자금 이체 서비스


1) 주기적 테스트(1년이내마다), 이상거래 모니터링 수행

2) 사용자 인증 강화 : 2 Factor 인증, 거래정보 연동, 예외조항 규정(편의성 고려)

3) 인증정보 보호, 사기율 관리 등

4) 안전한 통신 표준 규정

- 거래 단말기간 상호 식별 및 거래내역 기록

- 기관간 통신 인터페이스 구현(오픈 API)



PIP 설치 에러 해결방안(SSLError)

$
0
0

1. PIP 설치

python get-pip.py --trusted-host pypi.org --trusted-host files.pythonhosted.org


2. session.py 수정

/usr/local/lib/python2.7/site-packages/pip/_vendor/requests/session.py

에서 

self.verify = False 로 수정

CC인증 현황 확인

$
0
0

http://www.nis.go.kr/AF/1_7_3_3/view.do?seq=219&currentPage=1&selectProduct=2&moduleType=&selectSortTitle=&selectSortVerifyNumber=&selectSortCompany=&selectSortModule=&selectSortVerifyDate=&selectSortExpire=&searchKeyword=키워드

푸시 서비스(MQTT 등) 보안성 이슈

$
0
0

1. MQTT 구독/발행 시 권한 인증 및 제어 

  * 권한 인증을 위한 계정 정보 저장 및 불러오기 방법의 적정성 확인 필요

  * 가능하면 토큰 기반으로 서버 전송 후 삭제가 바람직(iOS 권고사항 참조)

     (https://developer.apple.com/documentation/usernotifications/registering_your_app_with_apns)

2. 토픽 리스팅에 대한 권한 인증 및 제어

3. MQTT 푸시 발생시 일시적 트래픽 집중

  - MQTT 서버 외 네트워크 장비/ 보안 장비도 고려

4. MQTT 데이터에 대한 기밀성(개인정보, 금융정보 등) 확보 대책(SSL 등)

5. MQTT 미사용(FCM 또는 APNS) 시 실시간 중요정보 유실에 따른 대책 마련 필요

  - FCM 전송율 90%,  APNS 전송율 안정적

    https://stackoverflow.com/questions/27967691/are-android-push-notifications-reliable


[참고자료]

http://rationalowl.tistory.com/6



* 추가 정보 수집 필요(자료 확보 못함)

- iOS은 APNS에서 발급한 Device Token을 이용해서 푸시를 전송

1. 각 iOS 단말은 단말 인증서로 APNS 서버와 인증 후 접속

2. 각 Push Provider도 Provider 인증서로 APNS 서버와 인증 후 접속

3. iOS 단말은 APNS 서버를 통해 Device Token 발급 요청(APNS 서버는 단말 인증서의 단말 고유정보에 기반하여 Device Token 생성)

4. APNS 서버는 iOS 단말에 Token Key로 암호화된 Device Token 전달


 


[MQTT 이슈]

- 안드로이드 Doze 모드 적용으로 FCM(GCM)과 함께 이용하여야 함



공공 Push Notification 서비스와의 기능 비교

Google GCM

Apple APNS

MQTT

양방향 통신

불가: Push만 가능

불가: Push만 가능

지원양방향(Push/Push)

컨텐츠

텍스트최대 4KB

텍스트최대 256B

모든 데이터 유형 지원최대 256MB

서비스 수준 준수(SLA) QoS 전송시간(Latency)

미지원:
전송 보장/확인 메커니즘 미제공
일관적이지 않은 전송 시간

미지원:
가장 최근 메시지 한 건만 저장 일관적이지 않은 전송 시간

지원:
전송 보장/확인 메커니즘에 대한 전적인 조절/제어권 확보

보안

네트워크 구간에 대해서는 제공
Google 서버에서 평문화됨 이용자가 제어할 수 없음

네트워크 구간에 대해서는 제공
APNS 서버에서 평문화됨 이용자가 제어할 수 없음

서드파티 개입이 없으므로 고도의 보안성 확보양방향(서버/클라이언트인증구간 암호화

Pub/Sub 메시징 지원

미지원:
Push 
수신자들에 대해 개별적으로 송신해야 함최대 1K 수신자에 대한 동시 송신

미지원:
Push 
수신자들에 대해 개별적으로 송신해야 함최대 연결 당 2K 동시 송신

지원:
매우 많은 수(수십만수백만)의 동시 사용자에 대한 메시지 발행

지원 플랫폼

Android

iOS, Mac OS X

Android, iOS 등의 모바일 플랫폼과 대부분의 서버 플랫폼 및 개발 환경 지원




Kalilinux 자바 버전 업데이트

$
0
0

sudo su -

cat >/etc/apt/sources.list.d/webupd8team-java.list<< EOF

deb http://ppa.launchpad.net/webupd8team/java/ubuntu trusty main

deb-src http://ppa.launchpad.net/webupd8team/java/ubuntu trusty main 

EOF

apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys EEA14886

apt-get update

apt-get install oracle-java8-installer

java -version

steganography 도구

자기소개서 작성 및 면접 고려사항

$
0
0

자기소개서

- 질문의 내용에 부합하는 내용을 적을 것

- IT의 경우 관련 프로젝트, 관련 업무 수행 경험 등 자신을 어필할 수 있는 내용을 재료로 해서 작성

  * 동호회 회장 경력 등은 무쓸모, 실제 본인이 수행했던 내용을 중심으로 자세하게 적으면 좋음

- 지원 기관의 업무와 관련없는 내용은 쓰는건 도리어 마이너스 포인트


면접

- 단순히 질의에 대해 못한다, 모른다고 답변을 끝마치기보다는 어필할 수 있는 부분을 답변

- 열심히 배우겠다 => 누구나 할수 있는 답변이므로 어필이 어려움

- 봉사활동 => 면접심사자 입장에서는 무쓸모


신용정보관리업, PSD2, RTS, GDPR 개요 정리

$
0
0

[마이데이터 표준 API 관련 보안고려사항 ]

1. 네트워크

- 핀테크 업체(AISP)와 금융회사(ASPSP) 간 통신 안정성 => PSD2


[주요 참고자료]

- 금결원 오픈 API(한국)

- 코스콤 오픈 API(한국)

- Berlin Group(독일)

- Polish API(폴란드)

- STET (프랑스)

- API Evaluation Group(EU) : API 표준 개설 중

- Open Banking(영국) - 9개 은행 참가

  - 2018년 1월 런칭

  - PSD2보다 더 확대적(예 : 가격 비교 가능)

  - Monzo 은행 : 개별 API => Open Banking 표준과 비슷

 - PSD2 관련 업종

  - Kreditech(신용정보 조사, 스페인, 폴란드, 신용기록없이 신용정보 분석 및 제공)

  - PPRO(페이먼트, 영국, 독일, 


* CFPS RR2018_06(Europe Payments Revolution)


[PSD2, GDPR 목적]

* General Data Protection Regulation

* Payment Service Directive II

- 개인정보에 대한 본인 제어권 부여

- 사용자 동의 시 추가 서비스 제공

- 명시적 동의의 의미가 다름 (PSD2, GDPR)

 * PSD2는 추가적인 계약을 통해 명시적 동의를 획득




[주요경과]

- 2015.8     : PSD2 개정 

- 2018.1.13 : PSD2 시행

- 2018.3.13 : RTS 승인

- 2018.3.25 : GDPR 시행

- 2019.9.13 : RTS 시행



[PSD2]

1. 개요

- EU의 2차 지급결제서비스 지침(Payment Service Directive)

- 사용자 인증 절차 강화, 인증정보 관리 보안 강화, 신규서비스 활성화를 위한 오픈 API 구현을 의무화

- 세부 구현은 별도 제정하여 19.9월 시행


* 용어정리

- AISP(Account Information Service Provider) : 은행별 계좌 정보 제공 서비스
- PISP(Payment Initiation Service Provider) : 은행간 자금 이체 서비스
- ASPSP(Account Servicing Payment Service Provider) : 계좌 제공 지급서비스 제공자(은행 등)


2. 주요 내용

- AISP, PISP의 의무규정 명문화

1) 주기적 테스트(1년이내마다), 이상거래 모니터링 수행

2) 사용자 인증 강화 : 2 Factor 인증, 거래정보 연동, 예외조항 규정(편의성 고려)

3) 인증정보 보호, 사기율 관리 등

4) 안전한 통신 표준 규정

- 거래 단말기간 상호 식별 및 거래내역 기록

- 기관간 통신 인터페이스 구현(오픈 API)



- PSP(Payment Service Provider) 유형

1) 계좌 입금/출급

2) 자금이체 기반 지불 (자동이체/직불이체/계좌이체)

3) 신용한도 기반 지불 (자동이체/직불이체/계좌이체)

4) 지불수단발행/지불거래취득

5) 송금

6) PISP, AISP



[GDPR] 

1. 개요

- 유럽연합의 개인정보보호법, General Data Protection Regulation


2. 주요 내용

1) 사전 동의(Consent)

EU 거주자에 대해 개인별로 식별 가능한 정보를 수집, 저장, 처리하는 조직(=정보 관리자, Controller)은 정보 주체로부터 사전 동의를 받아야 합니다. 동의를 구할 때에는 간략하고, 명확하고, 모든 법률적, 전문적 용어를 빼고 쉽게 어떤 정보 처리를 위해 어떤 동의가 필요하다는 것을 명확하게 설명해야 합니다.


2) 정보 수집, 처리 기록(Records of processing activities)

정보 주체로부터 개인정보를 수집하는 모든 조직은 어떤 목적에서 정보를 수집하고 있는지, 무슨 이유로 어떻게 해당 정보를 사용하거나 처리할 것이며 누구와 공유할 것인지 반드시 기록으로 남겨야 합니다.


3) 정보 침해 공지(Data breach notification)

정보 관리자는 개인정보 및 보안에 위협이 될 만한 모든 침해 사실에 대해 정보 주체에게 공지할 의무가 있습니다. 이 같은 공지는 침해 사실이 발견된 지 72시간 내에 전달되어야 합니다. 또한 정보 관리자를 위해 정보를 처리하는 모든 조직(=정보 처리자, Processor)은 모든 침해 사실에 대해 정보 관리자에게 지체 없이 알려야 합니다. 그리고, 기업은 자국의 정보 보호 당국에도 침해 사실을 보고하도록 규정합니다. 단, 특정한 경우 공지 의무에서 면제될 수 있습니다. 특정 경우란 정보가 암호화 되어 있거나, 가명 처리 등 비식별화된 경우를 말합니다. 침해된 정보로 각 개인의 신원을 직접적으로 밝힐 수 없거나 침해 발생 이후라도 신원 정보가 드러나는 것을 막기 위한 추후 조치를 했다면, 반드시 공지해야 할 의무는 없습니다.


4) 정보 보호를 위한 기술적, 조직적 조치(Data protection by design and by default)

EU 거주자의 정보를 다루는 조직은 제품과, 서비스를 계획하는 기본 단계부터 개인 정보 보호를 포함하고 전체 라이프 사이클 전반에 걸쳐 개인정보를 보호하는 것을 권장합니다. 개인 정보 침해를 막기 위한 조직적 절차나 적절한 기술적 제어 등을 통해 사전에 조치하고, 시행할 의무가 있습니다. 정보 관리자는 특정 상황에서 개인 정보 영향 평가(Data protection impact assessment)를 시행하여야 합니다. 개인 정보의 노출, 도용 위험이 있는 신기술의 사용이나 특정 정보 처리를 하는 경우, 영향도를 사전에 예상하여 정보를 확인하는 사람이 누구든지 해당 정보의 주체를 바로 식별할 수 없는 형태로 정보를 가공하도록 권고합니다.


5) 정보 열람권(Right of access)

정보 주체는 자신과 관련한 정보 관리자가 가진 개인 정보에 대해 사본을 요구하고 확보할 수 있습니다. 조직은 요청을 받으면 각 개인에게 현재 어디서, 무슨 목적으로 처리되고 있는지에 대해 답변을 해야 합니다. GDPR은 조직이 어떤 개인 정보를 보유하고 있는지, 현재 어떻게 사용되고 있는지, 누구와 공유하고 있는지, 어디서 해당 개인 정보를 얻었는지 기록하기 위해 알기 쉽고 명확한 수단을 보유하라고 요구하고 있습니다.


6) 정보 이동권(Right to data portability)

EU 거주자는 자신의 개인 정보를 한 정보 관리자로부터 다른 정보 관리자로 이동시키라고 요구할 권리를 가집니다. 정보 관리자는 표준적이고, 기기가 읽을 수 있는 형태로 요구 받은 정보를 제공해야 하며, 이러한 요구에 대해 어떠한 요금도 책정해서는 안됩니다.


7) 정보 삭제권(Right to erasure)

정보 주체는 조직에게 자기 개인 정보를 삭제하도록 요구할 권리를 가집니다. 또한 정보 주체는 정보 관리자에게 자기 개인 정보를 제 3자에게 전파, 공유, 처리하는 것을 중지하라고 요청할 권리가 있습니다. 정보 삭제는 개인 정보가 특정 조건을 위해 더 이상 필요치 않은 상황이나, 정보 주체가 해당 정보의 사용에 대한 동의를 철회하는 모든 상황에서 요구됩니다.


8) DPO(Data protection officer)의 지정

조직은 데이터 보호 책임을 지는 데이터 보호 관리자를 지정할 의무가 있으며, 특히 공공기관인 경우 더욱 중요합니다. 지정된 데이터 보호 관리자는 정보 관리자와 정보 처리자에게 개인 정보 처리 시 GDPR에서의 의무를 공지 및 조언하고, 해당 의무를 준수하는지 규칙적이고 체계적인 모니터링을 통해 감시해야 합니다. 또한 데이터 보호 관리자는 개인 정보 처리를 포함한 여러 사안과 관련해 연락책 역할을 수행할 책임이 있습니다.



PIP 설치 에러 해결방안(SSLError)

$
0
0

1. PIP 설치

python get-pip.py --trusted-host pypi.org --trusted-host files.pythonhosted.org


2. session.py 수정

/usr/local/lib/python2.7/site-packages/pip/_vendor/requests/session.py

에서 

self.verify = False 로 수정

CC인증 현황 확인

$
0
0

http://www.nis.go.kr/AF/1_7_3_3/view.do?seq=219&currentPage=1&selectProduct=2&moduleType=&selectSortTitle=&selectSortVerifyNumber=&selectSortCompany=&selectSortModule=&selectSortVerifyDate=&selectSortExpire=&searchKeyword=키워드

푸시 서비스(MQTT 등) 보안성 이슈

$
0
0

1. MQTT 구독/발행 시 권한 인증 및 제어 

  * 권한 인증을 위한 계정 정보 저장 및 불러오기 방법의 적정성 확인 필요

  * 가능하면 토큰 기반으로 서버 전송 후 삭제가 바람직(iOS 권고사항 참조)

     (https://developer.apple.com/documentation/usernotifications/registering_your_app_with_apns)

2. 토픽 리스팅에 대한 권한 인증 및 제어

3. MQTT 푸시 발생시 일시적 트래픽 집중

  - MQTT 서버 외 네트워크 장비/ 보안 장비도 고려

4. MQTT 데이터에 대한 기밀성(개인정보, 금융정보 등) 확보 대책(SSL 등)

5. MQTT 미사용(FCM 또는 APNS) 시 실시간 중요정보 유실에 따른 대책 마련 필요

  - FCM 전송율 90%,  APNS 전송율 안정적

    https://stackoverflow.com/questions/27967691/are-android-push-notifications-reliable


[참고자료]

http://rationalowl.tistory.com/6



* 추가 정보 수집 필요(자료 확보 못함)

- iOS은 APNS에서 발급한 Device Token을 이용해서 푸시를 전송

1. 각 iOS 단말은 단말 인증서로 APNS 서버와 인증 후 접속

2. 각 Push Provider도 Provider 인증서로 APNS 서버와 인증 후 접속

3. iOS 단말은 APNS 서버를 통해 Device Token 발급 요청(APNS 서버는 단말 인증서의 단말 고유정보에 기반하여 Device Token 생성)

4. APNS 서버는 iOS 단말에 Token Key로 암호화된 Device Token 전달


 


[MQTT 이슈]

- 안드로이드 Doze 모드 적용으로 FCM(GCM)과 함께 이용하여야 함



공공 Push Notification 서비스와의 기능 비교

Google GCM

Apple APNS

MQTT

양방향 통신

불가: Push만 가능

불가: Push만 가능

지원양방향(Push/Push)

컨텐츠

텍스트최대 4KB

텍스트최대 256B

모든 데이터 유형 지원최대 256MB

서비스 수준 준수(SLA) QoS 전송시간(Latency)

미지원:
전송 보장/확인 메커니즘 미제공
일관적이지 않은 전송 시간

미지원:
가장 최근 메시지 한 건만 저장 일관적이지 않은 전송 시간

지원:
전송 보장/확인 메커니즘에 대한 전적인 조절/제어권 확보

보안

네트워크 구간에 대해서는 제공
Google 서버에서 평문화됨 이용자가 제어할 수 없음

네트워크 구간에 대해서는 제공
APNS 서버에서 평문화됨 이용자가 제어할 수 없음

서드파티 개입이 없으므로 고도의 보안성 확보양방향(서버/클라이언트인증구간 암호화

Pub/Sub 메시징 지원

미지원:
Push 
수신자들에 대해 개별적으로 송신해야 함최대 1K 수신자에 대한 동시 송신

미지원:
Push 
수신자들에 대해 개별적으로 송신해야 함최대 연결 당 2K 동시 송신

지원:
매우 많은 수(수십만수백만)의 동시 사용자에 대한 메시지 발행

지원 플랫폼

Android

iOS, Mac OS X

Android, iOS 등의 모바일 플랫폼과 대부분의 서버 플랫폼 및 개발 환경 지원




Kalilinux 자바 버전 업데이트

$
0
0

sudo su -

cat >/etc/apt/sources.list.d/webupd8team-java.list<< EOF

deb http://ppa.launchpad.net/webupd8team/java/ubuntu trusty main

deb-src http://ppa.launchpad.net/webupd8team/java/ubuntu trusty main 

EOF

apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys EEA14886

apt-get update

apt-get install oracle-java8-installer

java -version

steganography 도구

자기소개서 작성 및 면접 고려사항

$
0
0

자기소개서

- 질문의 내용에 부합하는 내용을 적을 것

- IT의 경우 관련 프로젝트, 관련 업무 수행 경험 등 자신을 어필할 수 있는 내용을 재료로 해서 작성

  * 동호회 회장 경력 등은 무쓸모, 실제 본인이 수행했던 내용을 중심으로 자세하게 적으면 좋음

- 지원 기관의 업무와 관련없는 내용은 쓰는건 도리어 마이너스 포인트


면접

- 단순히 질의에 대해 못한다, 모른다고 답변을 끝마치기보다는 어필할 수 있는 부분을 답변

- 열심히 배우겠다 => 누구나 할수 있는 답변이므로 어필이 어려움

- 봉사활동 => 면접심사자 입장에서는 무쓸모


JWS, JWT 정리

$
0
0

[용어 정리]

- JWS (JSON Web Signature) : 서버에서 인증을 증거로 인증 정보를 서버의 private key 로 서명한 것을 Token 화 한것.

- JWE (JSON Web Encryption) : 서버와 클라이언트 간 암호화된 데이터를 Token 화 한것.

- JWK (JSON Web Key) : JWE 에서 payload encryption 에 쓰인 키를 Token 화 한것.

- JWT (JSON Web Token) : JWS or JWE


[실제 예제]

JWS 구조 : header(JSON) + payload(JSON) + signature

* signature = sign(header+payload)

JWS header: 

{

  "alg": "HS256",

  "typ": "JWT"

}

JWS payload:

{

  "sub": "1234567890",

  "name": "John Doe",

  "admin": true

}


JWT:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ

Base64(header) = eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9

Base64(payload) = eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9

Base64(signature) = TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ

* sign key = Token 생성자의 private key (주로 인증 서버)



[JWS  인증 매커니즘]

1. 클라이언트 A 가 로그인

2. 서버에서는 payload 에 넣고 싶은 내용을 담은 후 (로그인한 사람의 정보, 접근 권한 등) 서명하고 Token 발행

3. 클라이언트는 다음 통신에서 Token을 함께 전달

4. 서버에서는 Token 수신후 서명 검증

5. 이후 정상 절차 수행


How does a JSON Web Token works




Authorisation Authentication 차이

$
0
0

인증(authentication) : 자신이 누구라고 주장하는 사람을 확인하는 절차

권한부여(authorization) : 가고 싶은 곳으로 가도록 혹은 원하는 정보를 얻도록 허용하는 과정

Viewing all 46 articles
Browse latest View live