2011-02-24 4 views
18

PHP의 mcrypt 라이브러리와 AES-256 (rijndael) 알고리즘을 사용하고 있는데, 키 + 초기화 벡터가 모두 실행되어야합니다.암호화 : 초기화 벡터 대 키 사용?

내 논리적 인 두뇌는 정말로 이것과 관련이 없습니다. 하나의 핵심만으로 충분하지 않습니까?

이론 시나리오 : 소유자 만 해독 할 수 있어야 데이터베이스에 저장 내가 암호화 한 경우
중요한 데이터는 사용자를 사용하는 것이 적절할 것 키 또는 초기화 중 하나에 암호를 해시 자신의 데이터에 벡터?

키를 초기화 벡터보다 더 사적인 것으로 간주해야합니까?

+2

+1 좋은 질문입니다. – rook

답변

11

사실 실제로 대부분의 구현에서 IV가 중요합니다. 또한 IV는 WEP 및 WPA1/WPA2 용 일반 텍스트로 전송되는 등 공용으로 사용하기에 안전하다고 간주됩니다. 동일한 키 + iv를 사용하여 동일한 일반 텍스트를 암호화 할 때 문제가 발생합니다. IV를 사용하지 않는 한 암호문은 동일합니다. 공격자가 임의의 일반 텍스트를이 키로 암호화 한 다음 암호문을 볼 수있는 경우 이것은 공격자가 얻은 다른 암호문을 강박하게 만드는 훨씬 빠른 방법입니다.

뿐만 아니라 IV는 무작위이어야합니다. 그렇지 않으면 CWE-329을 위반하게됩니다. 이것이 문제가되는 이유는 좀 더 섬세하고 I didn't get it at first입니다. 당신은 이것을 언급하지 않았지만 두 가지 중 하나를 사용하고 싶습니다. CBC or CMAC modes

암호에 대한 해시 함수의 사용은 String2Key 함수 사용과 거의 동일합니다. 침입자가 SQL 인젝션을 사용하여 키를 얻을 수없는 한 단색 디자인입니다.

+0

안녕하세요. 그게 내 모든 소식 이었어. 고마워요! 난 무작위 IV와 함께'CFC'를 사용한다면 나는 안전해야합니까? – Industrial

+0

@Industrial 실제로 'CBC'모드이고 IV **는 임의이어야합니다. 데이터베이스에서 iv에 대한 열을 가질 수 있고'mt_rand()'를 사용하여이 수를 생성 할 수 있습니다. – rook

+0

@ Rook Hmm. 암호화 및 해독간에 일관성이있는 IV가 없어도 암호화 된 문자열을 해독 할 수 없었으므로 실제로 무작위로 선택해서는 안됩니다. 어쩌면 내가 뭔가 잘못하고있는 중이거나 IV가 항상 완전히 무작위로 분류되어야한다고 말하고 있습니까? – Industrial

6

초기화 벡터 (IV)는 키가 아니며 비밀이 아닙니다. 사실, 종종 노출됩니다 (예 : 암호화 된 데이터 앞에 붙임). 이 알고리즘은 암호화 알고리즘에 대한 추가 무작위 입력으로 사용되므로 다른 IV를 사용할 때마다 동일한 데이터를 암호화 한 결과가 달라집니다. 이렇게하면 암호화 된 데이터에서 통계를 수집 할 수 없습니다. 자체적으로 암호화 강도를 "향상"하지는 않습니다.

here은 IV가 사용되는 방법과 이유를 보여주는 멋진 도표를 볼 수 있습니다.

+0

좋습니다. 감사! – Industrial

7

해시 된 암호를 키와 IV의 단일 소스로 사용하지 마십시오. 일반적으로 암호화 된 데이터를 업데이트하고 IV에이 데이터를 저장할 때마다 임의의 IV를 생성해야합니다. 키는 여러 번 재사용 할 수 있지만 소금으로 처리 된 해시를 사용하고 데이터와 함께 소금을 저장하십시오.

사용자 암호를 해시하고 암호 키로 사용하는 경우 동일한 암호를 사용하는 사용자는 동일한 키를 갖게됩니다. 데이터베이스 구조와 침입자 접근 권한에 따라 동일한 암호를 가진 사용자를 탐지 할 수있는 불행한 사례가있을 수 있습니다. 적어도이 고유 한 사용자 이름을이 해시에 추가하십시오.

모든 데이터 업데이트에 대해 IV를 변경하지 않으면 데이터 변경에 대한 정보가 유출 될 수 있습니다. CBC 또는 CFB 모드의 경우 첫 번째 일반 텍스트 블록이 동일한 암호 텍스트로 암호화되어 첫 번째 일반 텍스트가 변경 될 때까지이 변경 위치를 결정할 수 있습니다.

+0

매우 중요한 조언의 길이가되도록 – davka

+0

조언을 많이 주셔서 감사합니다! – Industrial

+0

DB에있는 하나의 필드 대신 최소한 3 개의 필드가 필요합니까? 암호화 된 가치, IV 및 소금? 우리는 DB에 4 개의 필드를 만들 수있는 키를 추가 할 수도 있습니다 (ofc는 DB에 키를 저장하지 않습니다). 많은 일처럼, 아마도 불필요한 것 같습니까? – Piero

0

블록 암호의 EBP 모드 또는 대부분의 스트림 암호를 사용하는 경우 다른 일반 텍스트에서 동일한 키 + IV 조합을 사용하면 공격자가 키의 XOR 결과를 직접 볼 수 있습니다.이 확장은 키 자체와 어느 정도까지 암호를 나타냅니다.

하지만 IV가 반드시 필요한 것은 아닙니까? 아니요. 다음 평문 블록 (두 번째 동일한 블록)에서 비밀번호를 매번 변경하는 한 IV 없이는 아무 문제가 없습니다. 사실 IV가하는 일은 위의 프로세스의 자동화입니다.

+0

EBP 모드 란 무엇입니까? 저것을 결코 듣지 않으며 빠른 수색은 아무것도 위로도를 돌지 않는다. OFB 및 CTR 모드는 효과적으로 스트림 암호이므로 키 스트림을 유출합니다. 그러나 인기있는 모드는 키 자체를 유출하지 않습니다. – CodesInChaos