웹 프로그래머는 암호화에 대해 무엇을 알아야합니까? [닫은]


27

웹 사이트 / 웹 응용 프로그램을 작성하는 프로그래머가 암호화를 이해해야합니까? 나는 대부분의 암호 알고리즘이 어떻게 작동하는지 전혀 모른다. 그리고 md5 / des / aes / etc의 차이점을 이해하지 못한다. 암호화에 대한 심층적 인 이해가 필요한 사람이 있습니까?

나는 그것을 필요로하지 않았지만 아마도 내가 뭔가를 놓치고 있는지 궁금합니다. salt + md5 해시를 사용하여 비밀번호를 암호화했으며 웹 서버에 SSL을 사용하도록 지시했습니다. 그 외에도 나는 다른 방법을 많이 사용했다고 말할 수 없으며 이러한 방법이 얼마나 안전한지 확실하게 말할 수 없습니다 . 나는 다른 사람들이 안전하다고 주장하기 때문에 사용합니다.

이 두 가지 간단한 예를 제외하고 웹 프로그래밍에서 암호화를 사용해야 할 필요성을 발견 한 적이 있습니까?


4
그들은하지 말아야한다는 것을 알기에 충분히 알고 있어야합니다.
SLaks

@SLaks : +1 100 % 동의합니다. 이 스레드에 대한 답변을 작성하여 이유를 확장했습니다.
Chris Jester-Young

답변:


41

웹 프로그래머는 절대 암호화 자체를 구현하려고 시도 해서는 안된다는 것을 알아야합니다 .

특히 이는 비보안 전문가가 암호화 기본 요소 중 하나를 직접 만지지 않아야 함을 의미합니다. AES, SHA-1 등의 수준에서 생각해서는 안됩니다. 대신, 고급 기능을 사용하여 메시지를 암호화 및 서명하고 암호를 "해시"해야합니다.

왜? 그렇지 않으면 사람들은 다음과 같은 생각으로 오도되기 때문입니다.

  • AES-256은 ECB 모드에서 사용하거나 비 랜덤 IV 값 등을 사용한다는 사실에도 불구하고 "훌륭한 암호화"입니다 (일부 모드에서는 비 랜덤이지만 고유 한 IV는 괜찮습니다. 너무 많아요)
  • 여러 메시지를 암호화하기 위해 동일한 대칭 키를 사용할 수 있습니다 (또는 직접 사용하기 위해 대칭 키를 코드에 저장).
    • 키 파생 함수를 사용하지 않고 암호를 키로 직접 사용하기로 결정할 수도 있습니다.
  • RSA를 사용하여 데이터를 직접 암호화 할 수 있습니다.
  • 보안을 유지하기 위해 비밀번호를 "소금과 MD5"로 간단하게 지정할 수 있습니다. 레인보우 테이블이 가장 약한 링크 라고 생각하면 다시 생각하십시오 .

같은 페이지 에 있기 위해서는 위의 항목 중 어느 것도 괜찮습니다 . 그것을 얻지 못하면 10 피트 극으로 암호를 만져서는 안됩니다! (AES-256 훌륭한 암호화입니다. 그러나 올바르게 사용하는 경우에만 사용하십시오. "중요한 크기가 아니라 사용하는 크기입니다.":-)

어떤 종류의 고급 기능에 대해 이야기하고 있습니까? 개인적으로 OpenPGP (사용하지 않는 데이터) 또는 SSL (동작중인 데이터) 라이브러리를 사용하는 것이 좋습니다. 이러한 프로토콜은 비대칭, 대칭 및 해시 알고리즘의 올바른 사용을 엄격하게 지정합니다. 예를 들어 OpenPGP의 경우 :

  • RSA를 사용하여 데이터를 직접 암호화하는 대신 메시지 당 임의의 세션 (대칭) 키를 생성 (중요)하고 RSA를 사용하여 해당 세션 키를 암호화합니다.
  • 키 파생 함수를 사용하여 암호를 키로 변환합니다. (OpenPGP 용어에서는 S2K라고하지만 "키 파생 함수"가 더 표준적인 용어라고 생각합니다.)
  • 좋은 모드 선택을 처리하므로 ECB를 사용하지 않습니다.
  • 키 관리를 처리하므로 신뢰할 수있는 키 등에 대한 임시 결정을 내릴 필요가 없습니다.

요약 : 보안 전문가가 아니고 AES 또는 SHA-1 또는 (허용 금지) MD5 수준에서 생각 하고 있다면 잘못하고있는 것 입니다. 보안 전문가가 작성한 보안 라이브러리 (예 : Bouncy Castle)는 보안 전문가가 설계 한 프로토콜 (암호화를위한 OpenPGP 또는 암호 해싱을위한 bcrypt 또는 scrypt 등)을 구현하는 라이브러리를 사용하십시오.

나는 어떤 방법으로도 암호 전문가가 아니지만 내 자신의 임시 프로토콜을 디자인하려고 시도하지 않을 정도로 충분히 알고 있습니다. 분명히하기 위해이 게시물 전체는 암호화 101 자료 입니다. 따라서이 게시물이 100 % 이해가되지 않으면 암호화 근처에 있지 않아야합니다.


4
대단해 "다시 생각하세요"에 링크 된 블로그 게시물을 좋아했습니다. chargen.matasano.com/chargen/2007/9/7/…
davidhaskins

+1이지만 동일한 대칭 키를 여러 번 사용하는 것이 좋습니다. 그것이 IV의 목적입니다 (그렇지 않으면 필요하지 않습니다).
orip

1
또한 Colin Percival of scrypt (및 기타) 명성에는 "Cryptographic Right Answers"라는 훌륭한 기사가 있습니다. SSL은 매우 문제가 있습니다 (키 폐기는 구현하기가 매우 어렵습니다). 더 많은 정보는 여기에 : daemonology.net/blog/…
orip

@orip 동의하지만, 다른 IV와 동일한 키를 사용하는 것이 일반적으로 메시지가없는 고유 한 메시지보다는 선택한 대칭 암호의 블록 크기보다 긴 경우에 더 유용합니다. 이전 메시지에 사용 된 IV를 추적하기위한 컨텍스트 또한 Colin Percival의 기사에 동의하십시오.
Chris Jester-Young

1
@Ajoy 나는 더 관련있는 것으로 링크를 변경했습니다.
Chris Jester-Young

14

암호화에 관한 기본 사항 (해시 란 무엇인가, 소금이란 무엇인가,이 암호화 등을 해독하는 것이 얼마나 어려운지 등) 외에는 아무것도 알 필요가 없지만 보안에 대한 공정한 지식이 필요합니다 일반.

웹 개발자로서 반드시 알아야 할 주요 보안 영역 :

  1. SQL 주입. 이것은 아마도 웹 개발자가 시스템에 구멍을 뚫을 수있는 가장 위험한 구멍 일 것입니다.
  2. 사이트 간 스크립팅 및 쿠키
  3. 스패 보트와 보안 문자.
  4. SQL 주입. 이것이 얼마나 중요한지 충분히 강조 할 수 없습니다.

하고있는 일에 대해 전혀 이해하지 못하는 것은 매우 위험합니다. 메시지 요약 해시와 암호화 해시의 차이점이 무엇을 망칠 수 있는지 모릅니다. 소금 만드는 법을 모른다면 당신을 망치게 할 수 있습니다.
시크릿

@ user1525 이것이 바로 암호화의 기본이라는 의미입니다. 암호화 알고리즘이 실제로 어떻게 작동하는지 알 필요는 없습니다.
biziclop

응답에 감사하고 SQL 삽입 및 기타 공격에 동의하지만 실제로 암호화에 대해 묻고있었습니다.
davidhaskins

2
@davidhaskins 예, 각 레벨이 이전 레벨을 기반으로하기 때문에 지적 할 가치가 있다고 생각했습니다. 보다 기본적인 수준에서 응용 프로그램을 보호하지 못하면 AES 작동 방식을 아는 것은 아무 가치가 없습니다. 내 경험상 이것은 많은 개발자들이 암호화에 집중하고 긴 보안 체인에서 그 역할을 잊어 버릴 수있는 함정입니다.
biziclop

4

보안에 대해 모든 엔지니어가 알아야 할 내용 및 학습 위치 라는이 강연을 본 기억이 있습니다 . 강연자는 Neil Daswani이며 Google 테크 강연으로 시작한 것이 좋습니다.

웹 프로그래머에게만 적용되는 것은 아니지만 "프로그래머가 보안에 대해 무엇을 알아야합니까?"라는 제목을 붙여야합니다. 암호화에 대한 기본 사항 이상을 알 필요가 없기 때문에 (그 자체로 재미있다)


2

암호화는 많은 상황에서 유용합니다. 우리가 사용한 예는 LAMP 호스트에서 사용하기 위해 Win / IIS 호스트가 만들고 설정 한 세션 쿠키를 암호화하는 것입니다.

md5 / sha1 해싱과 달리 암호화를 구현하려는 경우 대칭 암호화와 비대칭 암호화의 차이와 같은 몇 가지 기본 용어가 중요합니다. 이 둘의 차이점을 이해하면서 웹 개발자가 암호 해독 키를 올바르게 저장하고 보호하기 위해 수행해야하는 작업에 대한 이해를 발전시켜야합니다. 예를 들어 공유 호스트와 같이 전체 관리 제어 권한이없는 호스트에 배포 할 응용 프로그램을 개발하는 경우와 모든 관리자를 알고 신뢰할 수있는 서버에 배포하는 경우가 있습니다.


2

제 생각에는 코드를 공격하는 사람이 알고있는 암호화에 대한 모든 것을 알아야합니다. 해시, 솔트, 랜덤의 비 랜덤 성, 주요 암호화 알고리즘 (RSA, 3DES, AES 등), SHA-1 / MD-5 / et al.을 이해해야합니다. 그것들을 외울 필요는 없지만 해시 알고리즘의 효과와 그것을 강하게 만드는 방법을 알아야합니다. 충돌과 오 탐지가 무엇인지 알아야합니다. 암호화 알고리즘을 외울 수는 없지만 벤치 마크는 어느 시나리오에 가장 적합한 지 벤치 마크에 익숙해야합니다. 대칭 및 비대칭 암호화 및 사용시기를 설명하고 설명 할 수 있어야합니다. PKI가 무엇이며 어떻게 사용되는지 알아야합니다. 인증 기관이 무엇이며 인증 기관이 서버와 상호 작용하는 방법을 알아야합니다.

모든 것의 장단점을 아는 것이 그것의 배경을 아는 것만 큼 중요하지 않습니다. 특정 것들의 벤치 마크는 무엇입니까 (얼마나 빠르며 강약점 등).

이러한 권장 사항은 상급 또는 건축가 수준의 정보를위한 것입니다. 노를 젓는 웹 원숭이라면 이것에 대해 알 필요가 없습니다. 건축가가이 사실을 알아야합니다. 사이트를 관리하고, 디자인하고, 구현하는 등의 작업을 수행하는 경우 이러한 모든 개념을 잘 알고 지능적으로 대화 할 수 있어야합니다. 당신은 그것을 가르 칠 필요가 없으며 그것에 대한 정보를 받아들이고 전파하기 만하면됩니다.



0

이런 종류의 질문에 대한 일반적인 대답으로 나는 항상 당신이하는 일과 원격으로 관련된 것을 기본적으로 이해하려고 노력해야한다고 생각합니다. 물론 실제로 작업하고있는 것에 대한 구체적인 지식이 필요합니다. 어떤 영역이 어떻게 진화 할 것인지, "패션 적으로"무엇이 될 것인지, 미래에 무엇이 필요할 것인지를 예측하는 것은 매우 어렵습니다. 많은 문이 열렸습니다.

웹 프로그래밍에 대한 개인적인 경험으로 비대칭 암호화의 기본 개념을 발견했으며 그 내용은 후드 아래에서 무슨 일이 일어나고 있는지 이해하는 데 도움이되었습니다. 나는 그것 없이는 살아남을 수 있었지만 암호화와 수학을 좋아한다고 말해야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.