RE: Re:질문있어요..

안녕하세요 윤지수라고 합니다.
 
이미 정리는 다 되신거 같지만, 
역시 저도 비 전문가입장에서..참고로 의견을 써봅니다.
 
 
말씀하신 것처럼, 
아직 현대의 브라우저를 통해서 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 02:34:42 UTC