2012-03-24 1 views
2

저는 안전성을 염려하는 자바로 애플리케이션을 작성하고 있습니다. 바이트 배열을 암호화 한 후, 사용 된 키와 같은 잠재적으로 위험한 것을 메모리에서 강제로 제거하려고합니다. 다음 스 니펫 keybyte[]이며 data입니다. 더 이상 위험한 데이터를 포함하도록자바의 메모리에서 보안 된 데이터를 제거하십시오.

SecretKeySpec secretKeySpec = new SecretKeySpec(key, "AES"); 
Cipher cipher = Cipher.getInstance("AES"); 
cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec); 
byte[] encData = cipher.doFinal(data, 0, data.length); 
Arrays.fill(key, (byte)0); 

는 지금까지 내가 이해, 마지막 줄 위의 0으로 키를 덮어 없지만, 나는 덮어 쓰거나 유사 SecretKeySpec의 또는 암호를 축출 할 수있는 방법을 찾을 수 없습니다.

secretKeySpeccipher이 보유한 메모리를 강제로 덮어 쓸 수있는 방법이 있습니까? 누군가가 현재 메모리 상태 (예 : 콜드 부팅 공격)를 볼 수 있어야한다면 액세스 할 수 없습니다. 정보?

+0

'key'를 0으로 채우면 변수 - 키의 메모리에 할당 된 주소가 0으로 채워집니다. 그것은 당신이 찾고있는 것을 달성하는 것 같습니다. –

+0

예; 당신은 이미 키에 대해 그러한 기능을 포함하고 있음을 알게 될 것입니다. 문제는 secretKeySpec과 cipher는 모두 위험한 데이터를 포함하고 있으며, 나는 비슷하게 0을내는 방법을 알지 못합니다. – MBennett

+1

0- 잉 아웃은이 SO 답변에서 지적한 두 가지 이유로 완전히 안전하지 않습니다. http://stackoverflow.com/questions/120380/irretrievably-destroying-data-in-java – Ozzy

답변

0

당신은 오래된 C의 도덕적 동등하고 싶지 : 현대 C에서

bzero(static_cast<char>(secretKeySpec), sizeof(SecretKeySpec)) 

, memset 함수를.

(컴파일 타임에 알려진 고정 크기의 객체라고 가정).

Java에서 기능을 제공하지 않으면 C, C++ 또는 어셈블리의 원시 코드에 연결하십시오.

동등 암호.

경고 : finalize 위반과 같은 데이터 구조 속성을 위반할 수 있습니다. 또한 개체가 연결된 데이터 구조가 아니라 인접한 것으로 가정합니다.

관련 문제