출처 : 위키백과 http://ko.wikipedia.org/wiki/%EB%94%94%ED%94%BC-%ED%97%AC%EB%A7%8C_%ED%82%A4_%EA%B5%90%ED%99%98


디피-헬만 키 교환

위키백과, 우리 모두의 백과사전.

디피-헬만 키 교환(Diffie–Hellman key exchange)은 암호 키를 교환하는 하나의 방법으로, 두 사람이 암호화되지 않은 통신망을 통해 공통의 비밀 키를 공유할 수 있도록 한다. 휫필드 디피와 마틴 헬만이 1976년에 발표하였다.

디피-헬만 키 교환은 기초적인 암호학적 통신 방법을 수립하였으며, 이후 1977년 공개 키 암호 방식인 RSA 암호가 제안되었다.

방식[편집]

앨리스와 밥이 공개된 통신망에서 디피-헬만 키 교환을 하기 위해서는 다음과 같은 절차를 거친다.

  1. 앨리스가 소수 p, 그리고 1부터 p-1까지의 정수 g를 선택하여 사전에 밥과 공유한다.
  2. 앨리스가 정수 a를 선택한다. 이 정수는 외부에 공개되지 않으며, 밥 또한 알 수 없다.
  3. 앨리스가 A = g^a \text{ mod }p, 즉 g^a를 p로 나눈 나머지를 계산한다.
  4. 밥이 마찬가지로 정수 b를 선택하여 B = g^b \text{ mod }p를 계산한다.
  5. 앨리스와 밥이 서로에게 A와 B를 전송한다.
  6. 앨리스가 B^a \text{ mod }p를, 밥이 A^b \text{ mod }p를 계산한다.

마지막 단계에서 B^a = (g^b)^a = g^{ab}A^b = (g^a)^b = g^{ab}이며 따라서 앨리스와 밥은 g^{ab} \text{ mod }p라는 공통의 비밀 키를 공유하게 된다.

앨리스와 밥 이외의 인물은 a와 b를 알 수 없으며, g, p, g^a \text{ mod }p, g^b \text{ mod }p를 알 수 있다.

예제[편집]

이 과정을 실제 숫자를 통해 예를 들면 다음과 같다. 여기서는 설명을 위해 작은 크기의 소수를 사용하지만, 실제 응용에서는 안전을 위해 10진수 수백~수천자리 크기의 큰 소수를 사용한다. 공개된 정보는 파란색으로, 비밀 정보는 붉은색 굵은 글씨로 표시하였다.

  1. 앨리스와 밥은 p=23g=5를 사용하기로 합의한다.
  2. 앨리스가 비밀 정보를 전송하기 위해 임의의 정수 a=6을 고른 후, 밥에게 A = ga mod p 을 전송한다.
    • A = 56 mod 23
    • A = 15,625 mod 23
    • A = 8
  3. 밥은 임의의 정수 b=15 를 고르고, 앨리스에게 B = gb mod p 를 전송한다.
    • B = 515 mod 23
    • B = 30,517,578,125 mod 23
    • B = 19
  4. 앨리스는 밥에게서 받은 B 를 바탕으로 s = B a mod p 를 계산한다.
    • s = 196 mod 23
    • s = 47,045,881 mod 23
    • s = 2
  5. 밥은 앨리스에게서 받은 A 를 바탕으로 s = A b mod p 를 계산한다.
    • s = 815 mod 23
    • s = 35,184,372,088,832 mod 23
    • s = 2
  6. 앨리스와 밥은 이제 비밀 키 s = 2 를 공유하게 되었다.

여기서 p가 충분히 클 경우, 외부에서 비밀 키를 알아내기 위해 도청을 하는 도청자 이브는 g^a나 g^b를 통해 s를 알아낼 수 없는 것으로 알려져 있다. 앨리스와 밥은 두 사람 만이 아는 비밀 키 s를 갖게 되었으므로, 대칭 키 암호를 이용해 이후의 통신을 암호화할 수 있다.

그러나 p나 ab가 너무 작을 경우, 도청자는 가능한 모든 조합을 다 계산해보는 방식으로 s를 계산해낼 수 있다. 따라서 실제 비밀 통신에는 충분히 큰 소수를 사용해야 한다. 만약 p가 최소 300자리의 소수이고, a와 b가 각각 100자리 이상의 정수일 경우, 현재 인류가 보유한 모든 컴퓨터를 동원해도 공개된 정보로부터 비밀 키를 알아낼 수 없는 것으로 알려져 있다.

안전성[편집]

디피-헬만 키 교환은 소수 p와 g를 적절하게 고르면 도청에 대해 안전한 것으로 알려져 있다. 도청자 이브가 비밀키를 얻어내기 위해서는 앨리스와  사이의 통신에서 도청할 수 있는 정보인 g^a와 g^b로부터 g^{ab}를 구해야 한다. 이 문제를 디피-헬만 문제(Diffie-Hellman problem)로 부르며, 이 문제를 푸는 효율적인 알고리즘은 2013년 현재 알려지지 않았다. 이산 로그 문제를 효율적으로 풀 수 있을 경우 디피-헬만 문제 또한 효율적으로 풀 수 있지만, 그 역이 참인지는 알려지지 않았다.

안전한 키 교환을 위해서는 p와 g를 신중하게 선택해야 한다. g는 순환군 G의 차수가 소수이거나, 인수분해하기 어려운 큰 소수를 약수로 갖도록 해야 한다. 이 때문에 p와 \frac{p-1}{2}이 모두 소수인 안전 소수를 고르기도 한다. p가 안전 소수일 경우 G의 차수는 2 또는 \frac{p-1}{2}만을 약수로 갖게 된다.

또한 앨리스와 밥이 충분히 안전하지 못한 난수 생성 알고리즘을 사용할 경우, 공격자는 이를 이용해 다음 a와 b의 특성을 어느정도 예측할 수 있다.

디피-헬만 키 교환은 통신을 하는 대상과 비밀 정보를 공유할 수 있지만, 상대방에 대한 인증은 보장되지 않으며 중간자 공격이 가능하다. 앨리스와 밥이 상대방에 대한 인증을 하지 못할 경우, 공격자는 중간에서 통신을 가로채 앨리스와 공격자, 그리고 공격자와 밥 사이에 각각 두 개의 디피 헬만 키 교환을 생성하고, 앨리스와 밥이 각각 서로와 통신을 하는 것처럼 위장할 수 있다. 이와 같은 종류의 중간자 공격을 막기 위한 여러가지 다른 알고리즘이 개발되어 있다.



출처 : http://eastdg.wordpress.com/2014/04/09/ssltls-%EA%B8%B0%EB%B3%B8/


Key Exchange (키 교환)

SSL/TLS이 사용할 수 있는 몇몇 키 알고리즘들이 있는데, 대부분의 키 알고리즘들은 서버의 공개키를 이용하여 동작한다. 다음은 많이 쓰이는 키 알고리즘 들이다.

  • RSA: 서버의 키…….유형이 RSA 형식인 경우 사용가능하다. 클라이언트는 46바이트의 랜덤 값과 2바이트 버전을 포함한 총 48바이트의 “pre-master secret” 값을 만들어 서버의 공개키로 암호화 하여 전송한다. 이러한 경우 ServerKeyExchange 과정은 없다.
  • DHE_RSA: 서버의 키 유형이 RSA 형식인 경우지만, 해당 키는 서명을 하는 경우에만 사용된다. 실제 키 교환은 Diffie-Hellman 알고리즘을 이용하여 교환하는데, 이 경우 서버는 DH 인자값들(modulus, generator)과 DH용 공개키를 포함한 ServerKeyExchange 메시지를 보낸다. (아직까진 이걸로 추천)
  • DHE_DSS: DHE_RSA 키 알고리즘과 유사하게 동작하지만 서버가 DSS 키를 가지고 있는 경우 사용된다. DSS는 DSA로도 알려져 있으며 서명에만 쓰인다.

다음은 보안상이나 기타 다른 이유로 잘 쓰이지 않는 키 알고리즘들이다.

  • DH: 서버의 키 유형이 Diffie-Hellman 유형인 경우 사용된다.
  • DH_anon: DHE와 비슷하지만 서버의 서명이 없다. 서버의 인증서 없이 동작되기 때문에 MITM 공격에 취약하다.
  • PSK: 키를 이미 기타 다른 방법으로 공유한 경우 사용되는 키 알고리즘이다.
  • SRP: application of the SRP protocol which is a Password Authenticated Key Exchange protocol. Client and certificate authenticate each other with regards to a shared secret, which can be a low-entropy password (whereas PSK requires a high-entropy shared secret). Very nifty. Not widely supported yet.
  • An ephermeral RSA key: DHE와 비슷하지만 RSA 키쌍을 생성한다. 그렇기 때문에 성능 부분에 대해 꽤 비싼 비용을 지불하며, 또 그렇게 매력적인 옵션은 아니다.
  • ECDH_ECDSA, ECDH_RSA, ECDHE_ECDSA, ECDHE_RSA, ECDH_anon: elliptic curves를 이용한 다양한 DH* 알고리즘들로서 가장 강력하며 추후 표준이 될 수도 있다. (ECDH_anon은 제외)

현 시점에서는 elliptic curves를 이용한 DH* 알고리즘을 지원하는 클라이언트가 그리 많지 않다. 그리고 대부분의 클라이언트가 RSA 또는 DHE_RSA를 지원하기 때문에 이 2개를 먼저 고려하게 될 것이다. 이 2개중 어느것이 더 괜찮냐고 물어본다면 DHE_RSA가 더 괜찮다. 이유인즉 RSA경우 만약에 공격자가 서버의 비밀키를 획득하게 된다면 이전의 모든 SSL/TLS 전문들을 다시 복호화 할 수 있기 때문이다. DHE_RSA인 경우에는 별도로 교환된 키로 암복호화 하기 때문에 이전의 SSL/TLS 전문들을 다시 복호화 하기는 힘들다.



SHA1CryptoServiceProvider는 윈도우의 CryptoAPI(CAPI)를 래핑한 unmanaged 구현체 이고,
SHA1Managed는 .NET으로 구현한 Managed 코드


SHA1Managed가 상대적으로 느리다고 하는데, 그 차이는 ms 단위의 속도를 중요시 하지 않는 업무라면 문제 없을 듯 하고,
자체 구현이라 이식성도 좋아 보임


물론 사용 가능 하다면 SHA1CryptoServiceProvider 쓰는것이 최선..



http://codeissue.com/issues/i34dda6deaad90a/difference-between-sha1-sha1cryptoserviceprovider-sha1managed-and-sha1cng


SHA1CryptoServiceProvider: this is wrapper for unmanaged CryptoAPI(CAPI). This is Federal Information Processing Standard (FIPS) certified.

SHA1Managed: this is complete implementation of SHA1 using managed code. This is fully managed but not FIPS certified and may be slower.




'Dev > Encryption' 카테고리의 다른 글

SHA1 해쉬함수, boost 라이브러리로 구현  (0) 2014.10.22
디피-헬만 키 교환, C++ 예제  (0) 2014.10.17
디피-헬만 키 교환  (0) 2014.10.16
SSL 키 교환 방식  (0) 2014.10.15
Crypto++ 사용하기, 예제  (2) 2009.10.14


출처 : http://blogs.msdn.com/b/distributedservices/archive/2012/01/16/how-to-configure-the-msdtc-service-to-listen-on-a-specific-rpc-server-port.aspx



My name is Steven Graves and I am a Senior Support Escalation Engineer on the Windows Core Team.  In this blog, I will discuss how to configure MSDTC to use a specific port on Windows Server 2012/2012R2 as this has slightly changed from the way it is configured in Windows Server 2008 R2 in order to prevent overlapping ports.  As a reference, here is the blog for Windows 2008 R2.

How to configure the MSDTC service to listen on a specific RPC server port
http://blogs.msdn.com/b/distributedservices/archive/2012/01/16/how-to-configure-the-msdtc-service-to-listen-on-a-specific-rpc-server-port.aspx

Scenario

There is a web server in a perimeter network and a standalone SQL Server (or Clustered SQL Server instance) on a backend production network and a firewall that separates the networks. MSDTC needs to be configured between the web server and backend SQL Server using a specific port in order to limit the ports opened on the firewall between the networks.

So as an example, we will configure MSDTC to use port 5000.

There are two things that need to be configured on the frontend web server to restrict the ports that MSDTC will use.

  • Configure the ports DCOM can use
  • Configure the specific port or ports for MSDTC to use

Steps

1. On the web server launch Dcomcnfg.exefrom the Run menu.

2. Expand Component Services, right click My Computer and select Properties

clip_image002

3. Select the Default Protocols tab

clip_image004

4. Click Properties button

clip_image006

5. Click Add

6. Type in the port range that is above the port MSDTC will use. In this case, I will use ports 5001-6000.

7. Click OK back to My Computer properties window and click OK.  Here is the key that is modified in the Registry for theephemeral ports.

clip_image008

8. Start Regedt32.exe

9. Locate HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSDTC

10. Right click the MSDTC key, select New and DWord (32-bit) Value

11. Type ServerTcpPort for the key name

12. Right click ServerTcpPort key and select Modify

13. Change radio button to Decimal and type 5000 in the value data, click OK.  This is how the registry key should look

clip_image010

14. Restart the MSDTC Service (if stand-alone) or take the MSDTC Resource offline/online in Failover Cluster Manager if clustered.

To confirm MSDTC is using the correct port:

  1. Open an Administrative command prompt and run Netstat –ano to get the port and the Process Identifier (PID)
  2. Start Task Manager and select Details tab
  3. Find MSDTC.exe and get the PID
  4. Review the output for the PID to show it is MSDTC

clip_image012

Now DTC will be using the port specified in the registry and no other processes will try to use the same port thus preventing an overlap of ports.

Steven Graves
Senior Support Escalation Engineer
Microsoft Core Support

'Dev > SQL' 카테고리의 다른 글

SQL Server CLR - 레지스트리 읽기  (0) 2008.10.10
CTE (Common Table Expression)  (0) 2008.07.08
테이블 변수  (0) 2008.07.04


<예제, boost::asio 필요 라이브러리 >

# msvc-14.0 : vc++ 2015

# msvc-12.0 : vc++ 2013

# 64bit : address-model=64

bjam.exe toolset=msvc-11.0 link=static runtime-link=static --with-system --with-date_time --with-regex --with-thread -j 4 stage






출처 : http://www.viper.pe.kr/cgi-bin/moin.cgi/Boost


3.1. bjam 사용법 [Bottom] [Top]

Boost 라이브러리는 대부분 Template 으로 구성되어 있다. 하지만 regex, thread 와 같이 빌드가 필요한 라이브러리를 포함하고 있다. bjam 은 이런 라이브러리들을 빌드와 설치를 자동화 해주기 위한 프로그램으로 직접 빌드해서 사용해도 되고 아래의 링크에서 다운받아서 사용해도 된다.

  • 다운로드 - http://sourceforge.net/project/showfiles.php?group_id=7586&package_id=72941&release_id=643622

  • 사용법
    bjam [options] [properties] [install|stage]
    
  • Targets 과 관련 옵션 ([install|stage], [options])
    install
    헤더 파일과 빌드된 라이브러리 파일을 설치한다.
    --prefix=<PREFIX>

    플랫폼에 종속적이지 않은 파일(헤더 파일)을 설치할 경로를 지정한다. (기본값: [Win32] C:\Boost, [Unix계열] /usr/local)

    --exec-prefix=<EPREFIX>

    플랫폼에 종속적인 파일(바이너리 파일)을 설치할 경로를 지정한다. (기본값: <PREFIX>)

    --libdir=<DIR>

    라이브러리 파일을 설치할 경로를 지정한다. (기본값: <EPREFIX>/lib)

    --includedir=<HDRDIR>

    헤더 파일을 설치할 경로를 지정한다. (기본값: <PREFIX>/include)

    stage
    빌드된 라이브러리 파일만 설치한다.
    --stagedir=<STAGEDIR>

    라이브러리 파일을 설치할 경로를 지정한다. (기본값: ./stage)

  • 기타 옵션 ([options])
    --build-type=<type>
    미리 정의된 빌드 타입 중에서 빌드될 타입을 지정한다. 단, 각 라이브러리에서 지원하는 빌드 타입에 한해서 빌드 가능하다.
    minimal (기본값)

    - 릴리즈 모드(빌드 속성: "release <threading>multi <link>shared <link>static <runtime-link>shared")만 빌드한다.

    complete
    - 가능한 모든 타입(릴리즈/디버그, 정적/동적, 싱글/멀티 쓰레드 등)의 라이브러리를 빌드한다.
    --build-dir=DIR
    빌드 시 사용될 임시 디렉토리를 지정한다.
    --show-libraries
    빌드가 필요한 라이브러리를 보여준다.
    --layout=<layout>
    Boost 의 다양한 버전에 대한 라이브러리 파일 이름과 헤더 파일의 위치를 결정하거나 동일 시스템에서 여러 컴파일러를 사용할 경우 사용한다.
    versioned (기본값)

    - 라이브러리(바이너리) 파일의 이름에 버전, 라이브러리 이름, 컴파일러 버전을 포함한다. Boost 헤더 파일은 Boost 버전이 포함된 이름으로 생성된 <HDRDIR> 의 하위 디렉토리에 설치된다.

    system

    - 라이브러리(바이너리) 파일의 이름에 버전, 라이브러리 이름, 컴파일러 버전을 포함하지 않는다. Boost 헤더 파일은 <HDRDIR> 디렉토리에 설치된다. 이 옵션은 배포 패키지를 빌드하기 위하여 준비된 옵션이다.

    --buildid=ID
    빌드된 라이브러리 파일 이름에 지정된 ID 를 추가한다. 기본적으로는 어떤 것도 추가되지 않는다.
    --help
    도움말을 보여준다.
    --with-<library>
    지정된 라이브러리만 빌드 후 설치한다.
    --without-<library>
    지정된 라이브러리를 빌드하지 않는다. (기본값: 모든 라이브러리를 빌드한다.)
  • 빌드 속성 ([properties])
    toolset=toolset
    컴파일러를 지정한다. (VC++일 경우: msvc 사용)
    variant=debug|release
    릴리즈 또는 디버그 모드로 빌드할지 선택한다.
    link=static|shared
    정적 또는 동적(공유) 라이브러리로 빌드할지 선택한다.
    threading=single|multi
    멀티 쓰레드 지원 여부를 선택한다.
    runtime-link=static|shared
    C/C++ Runtime 라이브러리를 정적 또는 동적(공유) 라이브러리로 링크할지 선택한다.
  • 중요 옵션 ([options])
    --clean
    Targets 을 정리(제거)한다.
    -a
    라이브러리를 재빌드(Rebuild)한다.
    -n
    빌드 명령을 실행하지 않고, 출력만 한다.
    -d+2
    실행되는 빌드 명령을 출력한다.
    -d0
    빌드 메시지를 출력하지 않는다.
    -q
    에러 발생 시 작업 과정을 중지한다.
    --debug-generator
    빌드 과정과 명령을 상세히 출력한다.
    --debug-configuration
    환경 설정 사항(요구사항 검사)을 포함하여 빌드 과정과 명령을 상세히 출력한다.
    --debug-building
    Targets 의 빌드 속성을 포함하여 빌드 과정과 명령을 상세히 출력한다.
  • 빌드가 필요한 라이브러리 (--show-libraries 옵션으로 확인 가능)

    • date_time (./)

    • filesystem (./)

    • graph
    • graph_parallel
    • iostreams (./)

    • math
    • mpi
    • program_options (./)

    • python
    • random
    • regex
    • serialization
    • signals (./)

    • system (./)

    • test
    • thread (./)

    • wave

3.2. 라이브러리 네이밍(Library Naming) [Bottom] [Top]

For example, libboost_regex-vc71-mt-d-1_34.lib can be broken down into the following elements:

lib

Prefix: except on Microsoft Windows, every Boost library name begins with this string. On Windows, only ordinary static libraries use the lib prefix; import libraries and DLLs do not.

boost_regex

Library name: all boost library filenames begin with boost_.

-vc71

Toolset tag: identifies the toolset and version used to build the binary.

-mt

Threading tag: indicates that the library was built with multithreading support enabled. Libraries built without multithreading support can be identified by the absence of -mt.

-d

ABI tag: encodes details that affect the library's interoperability with other compiled code. For each such feature, a single letter is added to the tag:

  • Key

    Use this library when:

    s

    linking statically to the C++ standard library and compiler runtime support libraries.

    g

    using debug versions of the standard and runtime support libraries.

    y

    using a special debug build of Python.

    d

    building a debug version of your code.

    p

    using the STLPort standard library rather than the default one supplied with your compiler.

    n

    using STLPort's deprecated “native iostreams” feature.

    For example, if you build a debug version of your code for use with debug versions of the static runtime library and the STLPort standard library in “native iostreams” mode, the tag would be: -sgdpn. If none of the above apply, the ABI tag is ommitted.
-1_34

Version tag: the full Boost release number, with periods replaced by underscores. For example, version 1.31.1 would be tagged as "-1_31_1".

.lib

Extension: determined according to the operating system's usual convention. On most unix-style platforms the extensions are .a and .so for static libraries (archives) and shared libraries, respectively. On Windows, .dll indicates a shared library and .lib indicates a static or import library. Where supported by toolsets on unix variants, a full version extension is added (e.g. ".so.1.34") and a symbolic link to the library file, named without the trailing version number, will also be created.




'Dev > C++' 카테고리의 다른 글

C++ REST SDK (casablanca) 간단 샘플  (0) 2015.02.17
[C++11] Variadic template  (0) 2014.11.02
boost::asio 클라이언트 소켓 (timeout 기능)  (0) 2010.10.14
이미지 변환 모듈 (모바일용, GDI+)  (0) 2010.06.22
C++0x, RValue Reference  (0) 2009.05.27

# 언어 설정  

sudo apt-get install language-pack-ko

sudo locale-gen ko_KR.UTF-8


sudo vi /etc/profile

LANG="ko_KR.EUC-KR"

LANG="ko_KR.UTF-8"


sudo vi /etc/environment

LANG="ko_KR.EUC-KR"

LANG="ko_KR.UTF-8"

LANGUAGE="ko_KR:ko:en_GB:en"


sudo vi /etc/default/locale

LANG=ko_KR.EUC-KR




# nginx 설치 

sudo apt-get install nginx




# php5 설치

# 의존성으로 php5 설치 됨

sudo apt-get install php5-fpm


# nginx, php5 유닉스 소켓으로 연결

sudo vi /etc/php5/fpm/pool.d/www.conf

; listen = 127.0.0.1:9000

listen = /var/run/php5-fpm.sock


sudo vi /etc/nginx/sites-enabled/default

location ~ \.php$ {

#   # With php5-fpm:

fastcgi_pass unix:/var/run/php5-fpm.sock;

fastcgi_index index.php;

include fastcgi_params;

}


sudo service php5-fpm restart

sudo service nginx restart



# oracle jdk 설치 및 tomcat 설치 

sudo apt-get install python-software-properties


sudo apt-add-repository ppa:webupd8team/java

sudo apt-get update

sudo apt-get install oracle-jdk7-installer


sudo apt-get install tomcat7

sudo vi /etc/default/tomcat7

JAVA_HOME=/usr/lib/jvm/java-7-oracle


sudo vi /etc/nginx/sites-enabled/default

location ~ \.jsp$ {

proxy_pass http://localhost:8080;

}


sudo service tomcat7 start

sudo service nginx restart



postgresql 설치 

sudo apt-get install postgresql postgresql-contrib


postgresql databse 기본 언어 설정 (ko_KR.utf8)

sudo -u postgres psql

psql (9.0.3)

Type "help" for help.

 

update pg_database set datallowconn = TRUE where datname = 'template0';


\c template0


update pg_database set datistemplate = FALSE where datname = 'template1';


drop database template1;


create database template1 with template = template0 'UTF-8' LC_CTYPE = ko_KR.utf8' LC_COLLATE = 'ko_KR.utf8'


update pg_database set datistemplate = TRUE where datname = 'template1';


\c template1


template1=# update pg_database set datallowconn = FALSE where datname = 'template0';


postgresql 리모트 접근 허용 (9.1 기준)

sudo vi /etc/postgresql/9.1/main/postgresql.conf

listen_addresses = '*'      # what IP address(es) to listen on;

                    # comma-separated list of addresses;

                    # defaults to 'localhost', '*' = all

                    # (change requires restart)

port = 5432             # (change requires restart)



# 개발툴 설치 

# gcc, g++ 등

sudo apt-get install build-essential

sudo apt-get install libboost-all-dev



# mono

sudo apt-get install mono-complete





'Dev > Linux' 카테고리의 다른 글

Gitlab Backup & Restore 방법  (0) 2017.01.10

- DEC입사 RSX-11라는 OS 개발

- 유닉스를 대항하고자 만든 VMS OS 개발 (나중에 OpenVMS로 발전)

- 1988년 DEC은 차세대 OS 개발 도중 프로젝트 취소 시킴


- 빌게이츠는 유닉스에 대항하고자 새로운 OS 개발의 니즈를 느낌 

- 마침 DEC에서 퇴사한 커틀러팀을 모두 MS에 영입 

- IBM과 같이 OS/2 NT 프로젝트를 Windows NT라는 이름으로 바꾸고 커틀러 중심으로 바꿈 (후 IBM과 분쟁) 

- 1993년 Windows 3.1의 UI를 가져오고 하위 호환성을 가지는 첫번째 NT커널OS인  Windows NT 3.1 개발


- NT 커널 개발시 빌게이츠는 유닉스와 같은 모놀리식이 아닌 마이크로 커널의 특징으로 개발 하는 것에 대해서 많은 의구심을 가졌고 커틀러는 안정성이 중요 하다는 이유로 설계를 변경 하지 않았고 코딩 테크닉으로 극복 하겠다고 주장 (NT는 모놀리식안에 마이크로 성격이 들어있는 하이브리드 커널로 분리)


- 현재 MS에서 근무 하고 있으며 최근 XBOX 부서로 옮김 

- 1942년 생이고, OS 개발 3번이나 성공시킨 인물 

- Windows 7에도 아직 그의 코드가 들어 있다고 ;; 


http://www.zdnet.co.kr/news/news_view.asp?artice_id=00000039129985

http://www.jiniya.net/wp/archives/146

http://noaa.byus.net/blog?page=74

  1. Uninstall PostgreSQL
  2. Delete the postgres user if it still exists.

    net user postgres /delete
  3. Create the postgres user with a password you can remember

  4. Add the postgres user to the Administrators group
  5. Add the postgres user to the Power Users group
  6. Run a command window as the postgres user

    runas /user:postgres cmd.exe
  7. Run the install file from within the command window.

    C:\Download\postgresql-9.1.4-1-windows.exe

    This should run the installation successfully.

  8. Remove the postgres user from the Administrators group.


http://dba.stackexchange.com/questions/10241/postgresql-the-database-cluster-initialization-failed


Tcpdump의 옵션들


-a : Network & Broadcast 주소들을 이름들로 바꾼다.

-c Number : 제시된 수의 패킷을 받은 후 종료한다.

-d : comile된 packet-matching code를 사람이 읽을 수 있도록 바꾸어 표준 출력으로 출력하고, 종료한다.

-dd : packet-matching code를 C program의 일부로 출력한다.

-ddd : packet-matching code를 숫자로 출력한다.

-e : 출력되는 각각의 행에 대해서 link-level 헤더를 출력한다.

-f : 외부의 internet address를 가급적 심볼로 출력한다(Sun의 yp server와의 사용은 가급적 피하자).

-F file : filter 표현의 입력으로 파일을 받아들인다. 커맨드라인에 주어진 추가의 표현들은 모두 무시된다.

-i device : 어느 인터페이스를 경유하는 패킷들을 잡을지 지정한다. 지저되지 않으면 시스템의 인터페이스 리스트를 뒤져서 가장 낮은 번호를 가진 인터페이스를 선택한다(이 때 loopback은 제외된다).

-l : 표준 출력으로 나가는 데이터들을 line buffering한다. 다른 프로그램에서 tcpdump로부터 데이터를 받고자 할 때, 유용하다.

-n : 모든 주소들을 번역하지 않는다(port,host address 등등)

-N : 호스트 이름을 출력할 때, 도메인을 찍지 않는다.

-O : packet-matching code optimizer를 실행하지 않는다. 이 옵션은 optimizer에 있는 버그를 찾을 때나 쓰인다.

-p : 인터페이스를 promiscuous mode로 두지 않는다.

-q : 프로토콜에 대한 정보를 덜 출력한다. 따라서 출력되는 라인이 좀 더 짧아진다.

-r file : 패킷들을 '-w'옵션으로 만들어진 파일로 부터 읽어 들인다. 파일에 "-" 가 사용되면 표준 입력을 통해서 받아들인다.

-s length: 패킷들로부터 추출하는 샘플을 default값인 68Byte외의 값으로 설정할 때 사용한다(SunOS의 NIT에서는 최소가 96Byte이다). 68Byte는 IP,ICMP, TCP, UDP등에 적절한 값이지만 Name Server나 NFS 패킷들의 경우에는 프로토콜의 정보들을 Truncation할 우려가 있다. 이 옵션을 수정할 때는 신중해야만 한다. 이유는 샘플 사이즈를 크게 잡으면 곧 패킷 하나하나를 처리하는데 시간이 더 걸릴 뿐만아니라 패킷 버퍼의 사이즈도 자연히 작아지게 되어 손실되는 패킷들이 발생할 수 있기 때문이다. 또, 작게 잡으면 그만큼의 정보를 잃게되는 것이다. 따라서 가급적 캡춰하고자 하는 프로토콜의 헤더 사이즈에 가깝게 잡아주어야 한다.

-T type : 조건식에 의해 선택된 패킷들을 명시된 형식으로 표시한다. type에는 다음과 같은 것들이 올 수 있다. rpc(Remote Procedure Call), rtp(Real-Time Applications protocol), rtcp(Real-Time Application control protocal), vat(Visual Audio Tool), wb(distributed White Board)

-S : TCP sequence번호를 상대적인 번호가 아닌 절대적인 번호로 출력한다.

-t : 출력되는 각각의 라인에 시간을 출력하지 않는다.

-tt : 출력되는 각각의 라인에 형식이 없는 시간들을 출력한다.

-v : 좀 더 많은 정보들을 출력한다.

-vv : '-v'보다 좀 더 많은 정보들을 출력한다.

-w : 캡춰한 패킷들을 분석해서 출력하는 대신에 그대로 파일에 저장한다.

-x : 각각의 패킷을 헥사코드로 출력한다.


사용 가능한 Primitive들

  • dst host HOST
    packet의 IP destination 항목이 HOST일때 참이 된다.
  • src host HOST
    packet의 IP source 항목이 HOST일때 참이 된다.
  • host HOST
    IP source, IP destination 항목 중 어느 하나라도 HOST이면 참이다.
  • ether dst ehost
    ethernet destination 주소가 ehost일 때 참이다.
  • ether src ehost
    ethernet source 주소가 ehost일 때 참이다.
  • ether host ehost
    ethernet source, destination 항목들 중 어느 하나라도 ehost이면 참이다.
  • gateway host
    패킷이 host를 게이트웨이로 사용하면 참이다. 이 말의 의미는 ethernet sour ce나 destination 항목은 host이지만, IP source와 destination은 host가 아닐 때를 말한다.
  • dst net NET
    패킷의 IP destination 주소가 NET의 network number를 가지고 있을 때 참이 다.
  • src net NET
    패킷의 IP source 주소가 NET의 network number를 가지고 있을 때 참이다.
  • net NET
    패킷의 IP source 주소 혹은 destination 주소가 NET의 network number를 가 지고 있을 때 참이다.
  • net netmask mask
    IP 어드레스가 지정된 netmask를 통해서 net과 매칭되면 참이다.
  • net net/len
    IP 어드레스가 netmask와 len 비트만큼 매치되면 참이다.
  • dst port PORT
    패킷이 ip/tcp, ip/udp 프로토콜의 패킷이고 destination port의 값이 PORT일 때 참이다. port는 /etc/services에 명시된 이름일 수도 있고 그냥 숫자일 수도 있다. 만약 이름이 사용됐다면 port 번호와 프로토콜이 같이 체크될 것이다. 만약 숫자나 불 확실한 이름이 사용됐을 경우에는 port 번호만이 체크될 것이다.
  • src port PORT
    패킷의 source port의 값으로 PORT를 가지면 참이다.
  • port PORT
    패킷의 source, destination port 중에 하나라도 PORT이면 참이다.
  • less length
    패킷이 length보다 짧거나 같으면 참이다.(len <= length)
  • greater length
    패킷이 length보다 짧거나 같으면 참이다.(len >= length)
  • ip proto protocol
    패킷이 지정된 종류의 프로토콜의 ip패킷이면 참이다. Protocol은 icmp, igrp, udp, nd, tcp 중의 하나 혹은 몇 개가 될 수 있다. 주의할 점은 tcp, udp, icmp들은 '\'로 escape되어야 한다.
  • ehter broadcast
    패킷이 ethernet broadcast 패킷이라면 참이다. ehter는 생략 가능하다.
  • ip broadcast
    패킷이 IP broadcast 패킷이라면 참이다.
  • ether multicast
    패킷이 IP multicast 패킷이라면 참이다.
  • ether proto protocol
    패킷이 ether type의 protocol이라면 참이다. protocol은 ip, arp, rarp 중에 하나 혹은 몇개가 될 수 있다. ip proto protocol에서와 마찬가지로 ip, arp, rarp는 escape 되어야 한다.
  • decnet src host
    만약 DECNET의 source address가 host이면 참이다. 이 어드레스는 '10.123'이 나 DECNET의 host name일 수 있다. DECNET host name은 DECNET에서 돌아가도록 설정된 Ultrix 시스템에서만 사용 가능하다.
  • decnet dst host
    DECNET destination address가 host이면 참이다.
  • decnet host HOST
    DECNET source, destination address중의 하나라도 HOST이면 참이다.
  • ip, arp, rarp, decnet
    ether proto [ip|arp|rarp|decnet]의 약어
  • lat, moprc, mopdl
    ether proto [lat|moprc|mopdl]의 약어
  • tcp, udp, icmp
    ip proto [tcp|udp|icmp]의 약어
  • expr relop expr
    • EXPR
      proto [expr:size]의 형식을 띤다. proto, expr, size에 올 수 있는 것들은 다음과 같다.
      • proto : ether, fddi, ip, arp, rarp, tcp, udp, icmp
      • expr : indicate Byte offset of packet of proto
      • size : optional. indicate the size of bytes in field of interest
      • default is one, and can be two or four
    • RELOP
      !=, =, <=, >=, etc.

    이 조건식을 사용하기 위해서는 먼저 해당하는 Protocol(proto)의 헤더에 관련된 것들을 자세히 알아야만 한다. proto에는 대상이 될 프로토콜을 지정한다. expr에는 프로토콜 헤더의 처음부터의 Byte Offset을 지정하는 식이 들어가게 된다. Size는 Option이며 지정이 안 되어 있을 경우에는 자동으로 1byte를 지칭한다. 따라서 이 조건식을 사용하게 되면 헤더에 포함된 정보를 Bitmask를 사용하여 직 접 원하는 패킷인지를 가려낼 수 있기 때문에, 보다 정밀한 사용이 가능하게 된다.


Tcpdump의 사용 예제들

security라는 호스트로부터 날아오고, 날아가는 패킷들을 출력
# tcpdump host security

security와 mazinga, getarobo 사이에 날아다니고 있는 패킷들을 출력
# tcpdump host security and \( mazinga or getarobo \)

security에서 elgaim을 제외한 모든 호스트로 날아다니는 IP 패킷들을 출력
# tcpdump ip host security and not elgaim

gateway amurorei를 거치는 ftp에 관련된 패킷들을 출력
# tcpdump 'gateway amurorei and ( port ftp or ftp-data )'

local호스트가 아닌 호스트와 로컬호스트가 맺는 TCP 커넥션의 시작과 마지막 패 킷들을 출력한다(SYN, FIN 패킷).
# tcpdump 'tcp[13] & 3 != 0 and not src and dst net non-local'

gateway amurorei를 지나는 576Byte보다 큰 패킷들을 출력한다
# tcpdump 'gateway amurorei and ip[2:2] > 576'

Ethernet boradcast 혹은 multicast를 통해서 보내진 것이 아닌, IP broadcast 혹 은 multicast 패킷들을 출력한다.
# tcpdump 'ehter[0] & 1 = 0 and ip[16] >= 224'

Echo request/reply가 아닌 ICMP 패킷들을 모두 출력한다.
# tcpdump 'icmp[0] != 8 and icmp[0] != 0'



참고 : http://coffeenix.net/doc/misc/tcpdump.html


'Dev > Network' 카테고리의 다른 글

TCP Connection Establishment Procedure & Connection Termination Procedure  (0) 2012.03.30
SSL Protocol  (0) 2007.09.08
network protocol  (0) 2007.07.23

[문제]


컴퓨터에서 실행 중인 Windows 7 SP1 이나 Windows Server 2008 R2 SP1 나 설치 하는 kb983246가 다시 컴파일하십시오 다음 ADO 응용 프로그램 하위 수준 운영 체제에서 실행 되지 않습니다.


http://support.microsoft.com/kb/2517589



[해결책]


#1. Windows 7 의 SP1 을 올리지 않는다. (권장 안함)

-> 현재 시스템 상 자동 업데이트 되고 있고, 개발을 위해서 업그레이드를 미루는 것은 문제가 있을 듯 합니다.


#2. 개인 PC의 ADO 버전을 강제로 내린다 (권장 안함 )

  -> 문제가 있고 추후 상위 버전의 개발을 위해서도 바람직 하지 않습니다. 


#3. ADO 버전을 고정 시킨다 (권장)

-> 현재 사용되는 msado15.dll 버전을 사용하지 않고 아래의 버전중에 하나를 사용한다. 

  - Vista 이상의 환경에서의 컴파일 : #import msado60.tlb (권장)

  - XP 이상의 환경에서의 컴파일 : #import msado28.tlb (옵션)



AS-IS

#import "C:\Program Files\Common Files\System\ado\msado15.dll" rename("EOF", "adoEOF")


TO-BE

#import "C:\Program Files\Common Files\System\ado\msado60.tlb" rename("EOF", "adoEOF")



[기타]

#. 해결책 

http://support.microsoft.com/kb/2640696


#. ADO 버전 

http://msdn.microsoft.com/ko-kr/library/windows/desktop/ms676506(v=vs.85).aspx


+ Recent posts