140 likes | 458 Views
3. : 패스워드 기반 암호화. 소제목 : 패스워드 기반 암호화. 이 장에서 다룰 내용. 1. Salt. 2. 2. Iteration Count. 2. 3. Base64. 2. 4. PBEKeySpec. 2. 5. SecretKeyFactory. 2. 6. PBEParameterSpec. 2. 7. PBE 알고리즘 이름과 제공자. 2. 8. 예제. 2. 패스워드 기반 암호화 (PBE). Password-Based Encryption.
E N D
3.: 패스워드 기반 암호화 소제목 : 패스워드 기반 암호화
이 장에서 다룰 내용 1 Salt 2 2 Iteration Count 2 3 Base64 2 4 PBEKeySpec 2 5 SecretKeyFactory 2 6 PBEParameterSpec 2 7 PBE 알고리즘 이름과 제공자 2 8 예제 2
패스워드 기반 암호화(PBE) • Password-Based Encryption 패스워드 기반 암호화는 키로 패스워드를 사용한다. PBE를 사용하면 물리적으로 저장을 하지 않기 때문에 더 안전하고 편리하다. 하지만 일반적으로 PBE는 TripleDes나 Blowfish 알고리즘만큼 안전하지 않다. 128비트의 Blowfish 알고리즘은 2^128 만큼의 키 스페이스를 제공한다. PBE는 보통 ASCII 캐릭터를 사용하고 패스워드의 길이는 보통 6글자이다. 만약 모두 소문자라면 26^6 대충 2 ^28 밖에 안된다. 대문자나 특수키를 사용한다고 하더라고 대칭 알고리즘에 비할 바가 못 된다. 이렇게 PBE 기반 암호화의 문제점은 미리패스워드 해쉬 목록을 만들어 놓고 이것들로 암호화된 데이터를 풀 수 있다는 것이다. 이 공격에는 두가지 대처법이 있는데 Salting과 Iteration counts이다. salt는 패스워드가 해쉬기 전에 붙는 랜덤 수 이고, iteration count는 salt와 패스워드가 해쉬 되는 횟수 이다.
Salt • 사용/적용 패스워드를 해쉬 하기 전에 랜덤 수를 더하면, 가능한 키가 훨씬 많아진다. salt가 없다면 “sasquatch”는 특정한 값으로 해쉬 되지만, 만약 8바이트 랜덤 수를 더한다면 “sasquatch”는 2^64개의 가능한 값을 가진다. 이런 식으로 하면 사전 공격을 막을 수 있다. 단순히 데이터를 비교하는 대신, 해쉬 계산을 수행해야 하므로 시간이 더 걸리게 된다. salt는 암호화된 데이터와 함께 저장된다. 새로운 데이터가 저장 될 때마다 새로운 salt가 생성된다. 이것은 같은 문장도 암호화할 때마다 다른 값이 된다는 것을 의미한다. 복호화하기 위해서는 암호화된 데이터로부터 salt를 반드시 구해야 하고 패스워드와 함께 더해서 복호화 열쇠를 생성해낸다. 시작하는 몇 글자는 salt이고, 나머지 글자는 salt와 함께 해쉬된 패스워드 이다. 만약 누군가 로그인하려면 운영체제는 입력된 패스워드와 패스워드 파일을 읽어 드린다. 로그인 하려는 사용자의 패스워드 엔트리 앞쪽과 입력된 패스워드를 해쉬해서 결과값이 같으면 입력된 패스워드가 정확한 것이다.
BASE64 바이너리는 보통 8비트에 저장되자만 표준ASCII는 7비트만 사용한다. ASCII로 바이너리를 표현하려고 한다면 한 바이트마다 한 비트가 손실될 것이다. BASE64인코딩은 이 문제를 극복하는 것이다. 8비트 바이트를 6비트 조각으로 변환 한 다음 금자로 바꾼다. 데이터가 어디서 끝나는지 정보를 나태내는 데 6비트를 사용한다. 인코딩된 글자는 화면에 표시할 수 있고, 다시 바이너리 데이터로 쉽게 변환할 수 있다. 8비트조각을 6비트로 바꾸는것이기 때문에 3바이트는 4캐릭터가 될것이다.
PBEKeySpec PBEKeySpec은 SecretKeyFactory의 인스턴스를 이용하여 패스워드에 기반을둔 키를 생성한다. 이것은 JCE에서 보기 드물게 생성자를 실체 호출 할 수 있다. 패스워드는 보통 스트링으로 저장되지 않기 때문에 char 배열을 매개변수로 받는다. 패스워드가 “sasquatch” 라고 한다면 char[] password = “sasquatch”.toCharArray(); PBEKeySpec keySpec = new PBEKeySpec(password);
SecretKeyFactory PBEKeySpec을 실제 키로 사용하기 위해서는 SecretKeyFactory의 generateSecret()와 함께 실행 시켜야 한다. SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(“PBEWithMD5AndDes”); SecretKey theKey = keyFactory.generateSecret(keySpec);
PBEParameterSpec PBE를 사용한 암호문을 생성하기 위해서는 salt와 iteration count를 인스턴스 생성시 암호문에 전달 해야 한다. PBEParameterSpec는 salt와 iteration count를 위한 객체이다. 이것은 키와 함께 암호문에게 전달된다. salt와 iteration이미 정의 되어 있다고 가정하면 다음과 같이 암호문을 얻을수 있다. PBEParameterSpec paramSpec = new PBEParameterSpec(salt, iterations); Cipher cipher = Cipher.getInstance(PBEWithMD5AndDes); cipher.init(Cipher.ENCRYT_MODE, theKey, paramSpec);
PBE 알고리즘 이름과 제공자 위에서 봤던 키 팩토리를 초기화할때 사용한 PBEWithMD5AndDes 라는 이름을 사용했다. 이것은 메시지 다이제스트로 MD5를 사용하고, 대칭 암호화 알로리즘으로 Des를 사용하는 패스워드 기반 암호화라는것을 의미한다. 패스워드 기반 암호화는 다음과 같은 여러가지가 있다 PBEWithMD5AndDes PBEWithSHAAndBlowfish PBEWithSHAAnd128BitRC4 .. 각 암호와 알고리즘을 사용하기 위해서는 각자 벤더에서 제공하는 제공자를 설치 하여 사용한다.
예제 실행방법 : c:\> java PBE –e sasquatch “Hello java Security” 결과 : dfjla/=40u35dak34pt=kfkl c:\> java PBE –d sasquatch “dfjla/=40u35dak34pt=kfkl”