RE: Re:질문있어요..

네 현업에서의 실제 상황은 많이 복잡한 거 같아보이네요.
제가 잘 모르고 오해한 부분까지 설명해주셔서 오히려 제가 도움이 많이 됐네요 :)
 
음 전  w3c에서 진행되는 것이나.. 브라우저벤더들이 적용한 내부 함수의 소스코드는 찾기 어려운 거 같네요.
국내에서도 http://www.w3.org/TR/WebCryptoAPI/ 여기 스펙에 밀접하게 참여하고 계신 보안/결제쪽에 전문가 분들이 계신 거 같은데.
그런 분들을 통해서 답을 얻을 수 있지 않을까 싶습니다.
 
주제를 벗어나서...개인적인 생각 한가지 더 말씀드리면,,
국내 보안수준이 꽤 높지만 결국 웹브라우저에서 그 수준을 맞춰줘야 순수웹기반의 암호화/인증 그런걸 할 수 있는 거 같습니다.
국내에서 뭔가 웹표준과 다른 길을 가는 건 위험하다고 생각합니다.(그게 알고리즘이건 전자서명의 새로운 방법이건.)
 
그래서 웹표준을 수립해나가는 것에 국내에서도 많은 전문가분들이 참여하시면 아주 빠른 길이 될 거 같습니다..
실제로 브라우저 벤더들이 경쟁적으로 우선해서 적용하려고 하는 거 같지도 않고요..
 
 
-----Original Message-----
From: "yslee"<yslee@pentasecurity.com> 
To: "윤지수"<jisu.youn@nhn.com>; 
Cc: "Sangwhan Moon"<sangwhan@iki.fi>; "HTML KIG"<public-html-ig-ko@w3.org>; "Wonsuk Lee"<wonsuk73@gmail.com>; 
Sent: 2013-08-12 (월) 12:13:00
Subject: 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 LeeEmail :
                          yslee@pentasecurity.com / Tel. 02.3775.7771
                
                
              
                
                  
                        
                          펜타시큐리티시스템(주)서울시 영등포구 여의도동 25-11
                                  한진해운빌딩 20층 (150-949)대표전화
                                  02.780.7728 팩스 02.786.5281 |
                                  www.pentasecurity.com
                        
                      
                
              
        
      
      2013년 08월 12일 11:34, 윤지수 쓴 글:

    
    
      
        안녕하세요 윤지수라고 합니다.

        
        이미 정리는 다 되신거 같지만, 

        역시 저도 비 전문가입장에서..참고로 의견을 써봅니다.

        
        
        말씀하신 것처럼, 

        아직 현대의 브라우저를 통해서 CPU, Memory와 같은
          Device에 접근은 안됩니다.

         
        
        제 생각에는..

        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 LeeEmail
                                : yslee@pentasecurity.com
                                / Tel. 02.3775.7771
                      
                      
                    
                      
                        
                              
                                펜타시큐리티시스
                                        템(주)서울시 영등포구
                                        여의도동 25-11 한진해운빌딩 20층 (150-949)대표전화 02.780.7728
                                        팩스 02.786.5281 | www.pentasecurity.com
                              
                            
                      
                    
              
            
          13. 8. 9. 오후 9:07, Sangwhan Moon 쓴 글:

        
        
          2013/8/9 yslee <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 04:04:36 UTC