웹 프로그래머는 절대 암호화 자체를 구현하려고 시도 해서는 안된다는 것을 알아야합니다 .
특히 이는 비보안 전문가가 암호화 기본 요소 중 하나를 직접 만지지 않아야 함을 의미합니다. 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 % 이해가되지 않으면 암호화 근처에 있지 않아야합니다.