Re: 질문있어요..

역시나 설명 및 의견 주셔서 감사합니다.

1)은 얘기가 좀 길어질 듯 하니 좀 있다 보고,
2)는 꼭 국정원 기준(사실은 암호모듈 검증(KCMVP) 기준)이라서가 아니라 암 
호알고리즘 자체에서 안전한 난수를 만들어내기 위한 것입니다.
알고리즘이 특정 browser 에 종속되는 것은 별로 아름답지 않겠죠.
3)도 2)와 비슷한 맥락에서 본다면, getRandomValues의 내부가 어떤 식으로 
구현되어 있는지에 대한 설명이 있어야 할 것 같습니다.
  "그냥 믿으세요"는 공학자에겐 있을 수 없는 얘기고, 설마하니 rand() 이런 
걸로 되어 있지는 않겠죠? ^^

1)의 경우 우리가 control 할 수 없는 API는 난수로 사용할 수 없다고 봐야 
합니다.
즉, getRandomValues는 난수로 사용할 수 없고, 난수를 생성하기 위한 seed 
값으로만 의미가 있겠죠.
단, getRandomValues가 어떻게 구현되어 있는지 입증이 필요합니다.

실제로 MS-Windows의 CSP(Criptographic Service Provider)에서 제공하는 난 
수발생기는 NIST로부터 FIPS 인증을 받았음에도 불구하고 우리나라에서는 난 
수발생기로 인정받지 못합니다.

요즘 난수발생기 표준은 ISO-IEC 18033-2 DRBG(Deterministic Random Bit 
Generator)입니다.
여기서 Deterministic이라는 용어에 주목할 필요가 있는데요.
즉, 동일한 Input에 대하여 동일한 Output을 내 줘야 하는데, source가 공개 
되지 않으면 확인할 방법이 없습니다.
왜냐하면 내부에서 seed를 만들고 output을 출력하는 interface만 있지 외부 
에서 input을 줄 수 있는 interface가 없기 때문에 테스트가 불가능하기 때문 
입니다.

그럼 다른 관점에서 보면 "미 정부에서 확인했는데, 우리는 그냥 믿어도 되는 
거 아니냐?"라고 하실 수 있으실텐데요.
암호는 전략물자로 분류되기 때문에 내부에 무슨 짓을 했는지 반드시 확인해 
야 합니다.
근래의 PRISM 사건 기억하시죠?

이런 얘기들이 오가면 "너무 인증에 민감한 거 아냐?"라고 하실 수 있으실텐데요.
인증보다는 알고리즘 차원에서 안전한 난수를 만들기 위한 노력이라고 보시는 
것이 타당할 것입니다.
인증은 안전한 난수를 만들었음을 입증하기 위한 하나의 방편이구요.

각설하고, 문상환님과 윤지수님의 설명과 의견 감사합니다.
source code나 자세한 spec.이 있는 문서들을 볼 수 있었으면 좋겠네요.

감사합니다.
끝.
--
펜타시큐리티시스템(주)
 *이 유 식*  암호시스템개발 부 / 부서장, Division Manager
 You-sik Lee  Email : yslee@pentasecurity.com / Tel. 02.3775.7771

Penta Security Systems <http://www.pentasecurity.com>  
펜타시큐리티시스템(주)
서울시 영등포구 여의도동 25-11 한진해운빌딩 20층 (150-949)
대표전화 02.780.7728 팩스 02.786.5281 | www.pentasecurity.com

 Penta Security Systems <http://www.pentasecurity.com>

2013년 08월 12일 11:34, 윤지수 쓴 글:
>
> 안녕하세요 윤지수라고 합니다.
>
> 이미 정리는 다 되신거 같지만,
>
> 역시 저도 비 전문가입장에서..참고로 의견을 써봅니다.
>
> 말씀하신 것처럼,
>
> 아직 현대의 브라우저를 통해서 CPU, Memory와 같은 Device에 접근은 안됩니다.
>
>
> 제 생각에는..
>
> getRandomvalues 
> <https://developer.mozilla.org/en-US/docs/Web/API 
> /window.crypto.getRandomValues?redirectlocale=en-US& 
> redirectslug=DOM%2Fwindow.crypto.getRandomValues>와 같은 표준스펙을 목 
> 표로 진행되는 api를 사용하는 것이 가장 좋을 거 같습니다.
>
> 여기서 문제는,,
>
> 1) 저 함수가 지원되는 브라우저의 범위가 너무 적다.
>
> 2) 국정원이 요구하는 난수값의 seed가 될 수 있는거 맞냐?
>
> 3) 기타 암호화 수준이 정말 안정적인가?
>
> 라는 것인데요.
>
> 반대의 순서부터 살펴보면
>
> 3번은 웹에서 암호화를 목적으로 만드는 메서드임으로 지금수준으로는 이걸 
> 믿고 사용해야 하는 것 같습니다
>
> http://www.w3.org/TR/WebCryptoAPI/  (아직 표준은 아님으로 가능성을 점 
> 치는 단계죠)
>
> 별도의 다양한 방법은 비표준스펙과 같은 또 다른 문제를 발생할 것이라 생 
> 각합니다..
>
> 2번은 국정원에서도 결국... 웹 표준(브라우저가 수용하고 지원하고 있는 
> 것)을 따를 수밖에 없는 현실인데.
>
> 웹에서 지원되지도 않는 기능을 사용하라고 이야기하는 건 브라우저 플러그 
> 인을 사용하라는 것밖에 생각이 나질 않네요.(웹상황을 잘 모르고 안정성만 
> 강조하는 거 같네요)
>
> 이건 국정원이나 KISA나 관련기관이 모여서 현재 진행중인 웹표준의 안정성 
> 을 검증해서 이를 토대로
>
> 솔루션 업체에서도 개발 가능한 스펙으로 규정을 바꿔야 한다고 생각합니 
> 다.. (아주 어려운 일이겠지만 )
>
> 1번은 다른 HTML5의 Javascript API와 같은 문제인거죠..
>
> 더구나 이와 같은 암호화 API는 다른 브라우저를 지원하기 위한 별도의 하 
> 위호환성 코드를 직접 구현하는 것이 특히나 더 위험하고 쉽지 않을 거 같고요.
>
> 결국 HTML5에 랜덤값을 생성하고 암호화를 하는 건 진행하더라도
>
> 브라우저가 W3C에서 진행되는 spec을 빠르게 반영해야하고,
>
> 그 진행정도에 따라서 먼저 지원되는 브라우저부터 웹 암호화 방식을 사용 
> 할 수밖에 없는 거 아닐까..싶네요.
>
> 마지막으로 개인적으로는
>
> 웹에서의 암호화 수준에 대한 국정원이나 KISA의 검토와 함께 가이드를 제 
> 시해주는 게 가장 좋다고 생각하고요.
>
> 가급적 사용성도 좀 고려해서 사용자입장에서 좀 생각해주면 더 좋겠고요 ㅎ
>
> -----Original Message-----
> *From:* "yslee"<yslee@pentasecurity.com>
> *To:* "Sangwhan Moon"<sangwhan@iki.fi>;
> *Cc:* "Wonsuk Lee"<wonsuk73@gmail.com>; "HTML 
> KIG"<public-html-ig-ko@w3.org>;
> *Sent:* 2013-08-12 (월) 08:18:09
> *Subject:* Re:질문있어요..
>
> 상세한 설명 감사합니다.^^
>
> 상환님 설명을 종합하자면 현재 상태로서는 구현에 무리가 있다고 보여지는 
> 군요.
> 실제 HTML5에서 어떻게 하고 있는지 알아야 겠다는 생각이 더욱 드네요.
>
> 참고로 entropy 확보를 위한 값들은 예를 든 것입니다.
> 반드시 그것들이어야 하는 건 아니라는 거죠.
>
> 그리고 RTOS를 사용하는 환경(즉, embedded)는 PRNG가 아니라 TRNG 구현이 
> 가능합니다만, 문제는 web에서 어떻게 그런 값들을 사용할 수 있는가 하는 
> 것입니다.
>
> 상환님 말씀대로라면 우리가 순수하게 구현하기는 어렵고, 제공되는 각종 
> API를 사용해야 한다는 제약이 있겠네요.
> (특히 인증-암호모듈 인증 by 국가정보원-은 망했군요. ㅠㅠ)
>
> 또한 사용자의 입력을 받는 부분도, 사용자 입력없이 데이터를 암호화해야 
> 하는 경우 사용할 수 없다는 제약이 생겨서 좋은 방안은 아닌 것 같아요.
>
> 감사합니다.
> 끝.
> --
>  *이 유 식*  암 호시스템개발 부 / 부서장, Division Manager
>  You-sik Lee  Email : yslee@pentasecurity.com / Tel. 02.3775.7771
>
> Penta Security Systems <http://www.pentasecurity.com>  
> 펜타시큐리티시스 템(주)
> 서울시 영등포구 여의도동 25-11 한진해운빌딩 20층 (150-949)
> 대표전화 02.780.7728 팩스 02.786.5281 | www.pentasecurity.com
>
>  Penta Security Systems <http://www.pentasecurity.com>
>
> 13. 8. 9. 오후 9:07, Sangwhan Moon 쓴 글:
>> 2013/8/9 yslee <yslee@pentasecurity.com <mailto:yslee@pentasecurity.com>>
>>
>>     안 녕하세요.
>>     지난 번 행사때 처음 만나서 되지도 않는 이런 저런 질문들을 했었는
>>     데.. 혹
>>     시 기억하실 지 모르겠습니다.
>>     이번 교육 때 session I, II 가 진행되지 않아 매우 아쉬웠습니다.
>>
>>     저는 보안 관련 업체에서 개발을 하고 있는데요.
>>     웹에 대한 이해가 짧아서 질문이 이상하더라도 살짝 이해해 주시길 부
>>     탁드립니다.
>>
>>     HTML 5에 보면 CryptoAPI 가 제공되는데요.
>>     제가 궁금한 것은 난수 부분입니다.
>>     난수는 보통 Block cipher에서 key를 만들거나, 공개키 특히 RSA에서
>>     short
>>     message attack을 방지하기 위한 de facto standard인 RSA-OAEP(현재는
>>     RSAES)에서 사용되기 때문에 필수라고 할 수 있습니다.
>>
>>     아시겠지만, 난수는 entropy 확보를 위하여 난수를 생성하는 seed(block
>>     cipher의 한 종류인 SEED가 아니라 난수를 생성하기 위한 씨앗 값을
>>     말합니
>>     다.)가 매우 중요합니다.
>>
>>     현재 우리나라에서 인정하는 표준은 ISO/IEC 18033-2:2006입니다.(기
>>     존에는
>>     "FIPS PUB 186-2 Addendix 3에 명시된 난수발생기의 변형 모델 중
>>     SHA-1을 이
>>     용한 G함수 사용 모델"이었습니다.)
>>
>>     국정원에서는 최소 256의 entropy를 확보하도록 하고 있는데, 이를 위해서
>>     CPU Clock, PID, TID, memory address, mouse pointer 위치 등의 값들
>>     을 가져
>>     옵니다.
>>
>>     제 질문의 요지는 HTML 5에서 저런 system의 값들을 가져올 수 있느냐
>>     는 것입
>>     니다.
>>     가져올 수 없다면 우리가 "난수"라고 부를 수 있는 것들을 생성하기
>>     어렵기
>>     때문입니다.
>>
>>     기존에 Javascript 등으로 암호 알고리즘을 구현하고 싶어도 할 수 없
>>     었던 이
>>     유가 난수를 제대로 만들 수 없어서였습니다.
>>
>>     HTML 5에서 이 문제를 어떻게 해결하고 있는지 궁금합니다.
>>     아시는 분들 있으시면 답변 부탁드릴께요.
>>
>> 암호화에 대해서 전문가는 아닌지라 허접한 답변이 될 수 있습니다만, 요 
>> 부터 말씀드리면 순수
>> javascript로는 언급하신 접근 방법 자체를 그대로 구현하는건 불가능하다 
>> 고 봅니다.
>> 다만,  가장 근접한것이 window.crypto.getRandomValues가 되는데, 이것의 
>> 하위 단에 있어서
>> 구현 방법 자체는 브라우저 그리고 환경에 따라 달라집니다. 언급하신 방 
>> 법을 true multi process
>> + multi threading 환경에서 구현할 경우 해당 방법과 유사한 또는 추가적 
>> 인 요소들이 포함될 것으로
>> 생각됩니다. 반대로 RTOS와 같은 cooperative multi tasking 환경의 경우 
>> 에는 다르게 구현을 해야
>> 할것으로 생각됩니다.
>> 이유인즛은, cooperative multi tasking 환경의 경우에는 PID가 없고, TID 
>> 도 없고, memory
>> address의 경우 대부분 정해진 절대 주소에 매핑이 되는 지라 해당 요소들 
>> 의 변동 여지가 굉장히
>> 적기 때문에 getRandomValues() 의 구현 단에서 다른 방법으로 접근을 해 
>> 야할 것으로 생각됩니다.
>> 기본적으로는 현재 상황에서는 getRandomValues()를 사용하고 나머지는 브 
>> 라우저에 맡기셔야 합니다.
>> 추가적으로 Math.random()의 경우 대다수 브라우저에서 가장 속도가 빠른 
>> PRNG를 사용하는 경우가
>> 대부분이므로 암호용 entropy로 사용하는건 대단히 위험합니다. 아울러 암 
>> 호화와 무관하면서도 난수성이
>> 높아야만 하는 프로그램을 구현하는데에도 사용하기가 어렵습니다. 이것 
>> 때문에 이전에 [1] mersenne
>> twister를 javascript로 구현한적이 있습니다. 다만 MT도 암호화용으로는 
>> 사용하기는 어려울것으로
>> 생각합니다.
>> 순수한 여담이지만 CPU clock이라고 말씀하신건 clock speed가 아니라 
>> tick count겠지요? clock
>> speed를 entropy용으로 사용하고 있다면 최근 상황에서는 난수성이 적다고 
>> 봅니다만... (tick count또는
>> 프로세스 시작 시점부터의 정밀한 단위의 monotonic timer를 이용하는거라 
>> 면 괜찮겠지만요)
>> (특히 CPU 종류가 그닥 많지 않은 모바일이나 Mac 환경에서는 더욱 문제가 
>> 될 것으로 생각합니다만..)
>> 만약에 javascript로 난수성이 높은 정보를 가져오고 싶다면 1) 사용자 입 
>> 력을 유도해서 그 입력시
>> 발생하는 key/mouse/touch/pointer events 2) deviceorientation events 
>> 3) sensor apis
>> 그리고 4) webrtc의 getusermedia 를 이용해서 카메라에서 들어오는 데이 
>> 터 등을 적당ㅎ사용하는
>> 방법이 있을것으로 생각됩니다. (geolocation도 사용이 가능할 것 같긴 합 
>> 니다만, 기본적으로
>> triangulation 이 된 데이터를 받는지라 원하는 만큼 난수성이 높을지는 
>> 잘 모르겠습니다.)
>> 감사합니다.
>> 문상환 배상
>> [1] https://github.com/cynthia/mt.js
>

Received on Monday, 12 August 2013 03:13:35 UTC