[Security] TLS-PSK

일단 기본 개념부터.

PSK는 Pre-Shared Key의 줄임말로, 보안이 필요한 통신을 하는 양자 간에 미리 공유된 symmetric 키를 말한다.

TLS는 Transport Layer Security의 줄임말로, SSL이 표준화되면서 쓰이는 이름이다.

TLS-PSK는 PSK를 이용해서 TLS연결을 맺는 것으로 RFC 4279에 문서화되어 있다.

RFC 4279의 내용을 살펴보자.

      Client                                               Server
      ------                                               ------

      ClientHello                  -------->
                                                      ServerHello
                                                    (Certificate)
                                               ServerKeyExchange*
                                             (CertificateRequest)
                                   <--------      ServerHelloDone
      (Certificate)
      ClientKeyExchange
      (CertificateVerify)
      ChangeCipherSpec
      Finished                     -------->
                                                 ChangeCipherSpec
                                   <--------             Finished
      Application Data             <------->     Application Data

위 그림이 TLS handshake과정을 나타낸다.

1. 클라이언트는 ClientHello 메시지에 TLS Version과 하나 이상의 cipher-suite을 실어 보낸다.

2. 서버는 ServerHello 메시지에 사용할 TLS Version과 사용할 cipher-suite를 실어 보낸다. ServerKeyExchange 메시지로 클라이언트가 어떤 PSK를 사용할 지, PSK identity hint를 함께 보낸다. ServerHelloDone도 보낸다.

3. 클라이언트는 ServerKeyExchange에 포함된 PSK identity hint로 사용할 PSK를 고른다. 고른 PSK의 PSK identity를 ClientKeyExchange 메시지에 실어 보낸다. Premaster secret은 PSK가 N octets라면, uint16 타입의 N, N개의 0 octets, 두번째 uint16타입의 N, 그리고 PSK N octets.

OpenSSL에서는 Client 쪽에서는 PSK callback을 SSL_CTX_set_psk_client_callback()이나 SSL_set_psk_client_callback()을 통해 설정하도록 되어있는데, 이 callback을 Server로부터 받은 PSK Identity Hint를 읽어 valid한지를 check하고, 해당 hint에 맞는 PSK를 psk에, PSK identity를 identity argument에 채워주는 역할을 한다. callback은 psk의 length를 return해야 한다. 0이나 그 이하는 error를 나타낸다.

Server쪽에서는 SSL_CTX_use_psk_identity_hint()나 SSL_use_psk_identity_hint()를 통해서 사용할 PSK Identity Hint를 Setting하고, SSL_CTX_set_psk_server_callback()나 SSL_set_psk_server_callback()을 통해 callback을 셋팅한다. 이 callback은 PSK identity가 valid한지를 체크하고, PSK identity가 있다면, pre-shared key를 psk argument에 채우고, PSK의 길이를 return한다.

 

* 참고

RFC 4279 – PSK Ciphersuites for TLS(https://tools.ietf.org/html/rfc4279)

TLS: https://en.wikipedia.org/wiki/Transport_Layer_Security, https://namu.wiki/w/TLS

TLS-PSK: https://en.wikipedia.org/wiki/TLS-PSK

OpenSSL

SSL_CTX_set_psk_client_callback: https://www.openssl.org/docs/manmaster/ssl/SSL_CTX_set_psk_client_callback.html

SSL_CTX_use_psk_identity_hint: https://www.openssl.org/docs/manmaster/ssl/SSL_CTX_use_psk_identity_hint.html

윈도우즈 전원 설정 command tool: powercfg

컴퓨터 전원 옵션을 자꾸만 건드리는 툴, 예를 들면, 보안 프로그램이라던지, 보안 프로그램이라던지, 보안 프로그램이라던지..가 껐다켜면 자꾸 내 전원 옵션을 잠깐 안쓰면 절전모드로 바꾸게 해둔다.
제어판에서 내가 원하는 전원 옵션, 즉, 항상 켜는 전원 옵션을 만들고. 커맨드 프롬프트에서 powercfg -l 을 입려하면 만든 옵션의 GUID가 나온다.
이걸 커맨드 툴로 셋팅하려면 powercfg -SETACTIVE 하면 적용된다.
이걸 시작 프로그램에 등록하자. ㅋㅋㅋ

ssh 접속 시 no matching key exchange method found. 문제

SSH 접속 시 다음과 같은 에러가 발생할 때가 있다.

Unable to negotiate with blog.dasomoli.org: no matching key exchange method found. Their offer: diffie-hellman-group1-sha1

OpenSSH가 7.0이상이면, 요 키 교환 알고리즘이 기본으로 켜져 있지 않아서 나는 문제인데, 다음과 같은 방법으로 해결 가능하다.

ssh -oKexAlgorithms=+diffie-hellman-group1-sha1 user@host

이걸 명령 줄 때마다 하긴 귀찮으니까 ~/.ssh/config 파일 안에 다음 내용을 추가하면 된다.

Host blog.dasomoli.org
KexAlgorithms +diffie-hellman-group1-sha1

참고: Using OpenSSH with legacy SSH implementations

OBD2

블랙박스, 후방 카메라 알아보다가 언젠가 한번 알아보리라 생각했던 OBD2. 급 관심이 생겨서 막 찾아보았다.

내 차에는 커넥터가 핸들 아래 패달 근처 왼쪽 쯤에 붙어 있는 듯 하다. 찾아봐야지..

16핀 짜리 커넥터를 쓰는데. 차량 관련 다양한 정보를 얻을 수 있다.

통신 방식은 여러가지가 있는데, VPW-PWM (SAE-J1850), CAN(ISO 15765, SAE-J2234), ISO (ISO 1941-2, ISO 14230-4) 이렇게 쓰인다고 한다.

전송 신호 방식은 자체는 PWM이나 UART, GPIO 통신과 비슷한 면이 많은 듯. 처리 IC가 많이들 있다고 한다.

https://en.wikipedia.org/wiki/On-board_diagnostics


OBD2 PID(parameter id)와 그 의미

https://en.wikipedia.org/wiki/OBD-II_PIDs

http://www.totalcardiagnostics.com/support/Knowledgebase/Article/View/21/0/genericmanufacturer-obd2-codes-and-their-meanings


얻을 수 있는 차량 정보가 엄청 많다.. 이거 다 알면 정비 공부 따로 안해도 되겠는데..;;

[Windows] touch가 필요할 때

윈도우즈 환경에서 개발하다보니, Linux 환경에서 사용하는 몇 가지 command들이 그립다.

touch 명령을 주고 싶은데, 다들 설치하라고 할 수도 없고..

Windows 환경에서 touch와 같이 날짜와 시간만 업데이트 하고 싶을 때, 해당디렉토리로 이동한 후, 다음과 같이 하면 된단다.

copy /b filename.ext +,,

이동하기 싫으면 다음과 같이 하면 된다.

copy /b D:\PATH\foo\filename.ext+,, D:\PATH\foo\filename.ext

이걸 왜 하냐고?

다음과 같은 코드 때문이다.

char *pStrTime=__TIME__;

char *pStrDate=__DATE__;

참고: http://superuser.com/questions/10426/windows-equivalent-of-the-linux-command-touch