2013-10-13 1 views
9

나는 DB의 비밀번호 저장을 PBKDF2 생성 된 해시로 지정하는 Java 인증 하위 시스템에서 작업 중이며, 이제 SHA1 또는 SHA512을 PFR로 사용해야할지 결정하려고합니다. 나는 두 가지 스펙을 모두 살펴 보았지만, 나는 수학적으로 집중적으로 따라야했다. PBKDF2WithHmacSHA512PBKDF2WithHmacSHA1과 다른 점을 암호 해독력이 더 좋은 사람이 설명 할 수 있습니까?PBKDF2WithHmacSHA512 VSs. PBKDF2WithHmacSHA1

는 여기에 내가 할 노력하고있어 무엇 :

private static final int HASH_BYTE_SIZE = 64; // 512 bits 
private static final int PBKDF2_ITERATIONS = 1000;  

// generate random salt 
SecureRandom random = new SecureRandom(); 
byte salt[] = new byte[SALT_BYTE_SIZE]; // use salt size at least as long as hash 
random.nextBytes(salt); 

// generate Hash 
PBEKeySpec spec = new PBEKeySpec(password, salt, PBKDF2_ITERATIONS, HASH_BYTE_SIZE); 
SecretKeyFactory skf = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1"); // we would like this to be "PBKDF2WithHmacSHA512" instead? What Provider implements it? 
byte[] hash = skf.generateSecret(spec).getEncoded(); 

// convert hash and salt to hex and store in DB as CHAR(64)... 

답변

0

SHA512는 암호화 해시 함수의 SHA2 제품군에 속한다. SHA1은 이론적으로 약점을 가지고 있으며 SHA512는 SHA1보다 약간 느립니다 (암호 해싱시 속도가 느립니다). SHA512 (또는 SHA2 제품군 중 하나)는 암호 해싱을 위해 SHA1에서 선택해야합니다.

사실 함수의 차이점을 이해하는 것은 간단하지 않지만 Crypto SE site에 대한 답변을 얻을 수있는 기회가 더 많을 수 있습니다.

+0

오른쪽 속도는 중요합니다. 그러나 PBKDF2에는 조정 가능한 작업 요소가 포함되어 있습니다. 따라서 SHA512 대 SHA1의 상대 속도는 무의미합니다. –

34

것은 조각으로 단어 조각이 우리 고장을 보자에 대한

  • PBKDF2

    스탠드를

    PBKDF2--WithHmac--SHA512 
    

    이의 그 위에 가자 부분 부분에 의해 암호 기반 - 키 - 파생 상품 -Function은 PBKDF1의 후속 모델이며 암호화 해시, 암호 또는 HMAC와 같은 의사 난수 함수를 구현하는 데 사용됩니다. 입력 된 암호 또는 암호문을 소금 값과 함께 여러 번 반복하여 파생 된 키를 생성 한 다음 후속 작업에서 암호 키로 사용할 수 있습니다. HMAC

  • 가 키를 붙인 해시 메시지 인증 코드 (HMAC) 스탠드하는 비밀 암호화 키와 함께 암호화 해쉬 함수를 포함하는 메시지 인증 코드 (MAC)을 계산하기위한 특정 구조이다. 모든 암호 해시 함수는 HMAC의 계산에 사용될 수있다. 결과적인 MAC 알고리즘은 그에 따라 HMAC-MD5 또는 HMAC-SHA1이라고한다.

    글쎄, 당신은 그것에 대해

  • SHA512을 알고 .. : P

를 이제 귀하의 질문에, 코드의 라인에 돌아 오는 :

SecretKeyFactory skf = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1"); 

지정 keyFactory는 알고리즘 PDBKDF2WithHmacSHA1을 사용합니다.

SecretKeyFactory skf = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA512"); 

당신은 알고리즘 PBDKF2WithHmacSHA512을 사용하도록 공장에 알립니다.

  1. PBKDF2WithHmacSHA1는 160 비트의 해시 길이를 생성 할 것이다 :

    Essentialy PBKDF2WithHmacSHA1PBKDF2WithHmacSHA512과의 주요 차이점이다.

  2. PBKDF2WithHmacSHA512은 512 비트의 해시 길이을 생성합니다.

따라서 후자는 더 안전합니다. 그러나 어느쪽에 암호화가 충분한 지에 대한 논쟁이있다. 논쟁은 없습니다. 그냥 말해.

두 알고리즘에 대한 일부 추가 정보 :

  1. HMACSHA1

    HMACSHA1은 HMAC으로서 SHA1 해시 함수로 구성하여 사용하는 키잉 해시 알고리즘의 타입, 또는 해시 기반 메시지 인증 코드 HMAC 프로세스는 비밀 키를 메시지 데이터와 혼합하고 결과를 해시 함수로 해시 한 다음 해시 값을 다시 비밀 키와 혼합 한 다음 해시 함수를 두 번 적용합니다. 출력 해시 길이는 160 비트입니다.

    HMACSHA512

    HMACSHA512

  2. 는 에서 SHA-512 해시 함수를 생성하고, 해시 기반 메시지 인증 코드 (HMAC)로서 사용되는 키잉 해시 알고리즘의 유형이다. HMAC 프로세스는 메시지 데이터를 과 함께 비밀 키와 혼합하고 결과를 해시합니다. 해시 값은 비밀 키와 다시 혼합되어 두 번째 해시됩니다. 출력 해시 의 길이는 512 비트입니다.

가장 큰 장점은 HmacWith512HmacWith256보다 더 안전하다는 것이다. 예 :

HMAC_SHA1("key","The quick brown fox jumps over the lazy dog") = 0xde7c9b85b8b78aa6bc8a7a36f70a90701c9db4d9 

HMAC_SHA512("key","The quick brown fox jumps over the lazy dog") = 0xb42af09057bac1e2d41708e48a902e09b5ff7f12ab428a4fe86653c73dd248fb82f948a549f7b791a5b41915ee4d1ec3935357e4e2317250d0372afa2ebeeb3a 

차이점은 꽤 크다. 희망이 도움이됩니다. :)

편집 : OP로

PBEKeySpec(char[] password, byte[] salt, int iterationCount, int keyLength) 

언급 매개 변수 keyLength 변수 키 사이즈 암호의 키 길이 에 대한 선호도를 표시하는 데 사용됩니다. 실제의 키 사이즈는, 각 프로 바이더의 구현에 따라서 다릅니다. 따라서

PBEKeySpec(password, salt, int 100, 512)과 같은 것을한다고해서 SHA1을 사용하여 512의 keyLength를 생성한다는 의미는 아닙니다. SHA1은 최대 160 비트까지 지원합니다. 너는 그것을 초과 할 수 없다.

두 번째 질문은 HMAC-SHA1입니다. 너가 긴 해시라면 SHA256과 같은 알고리즘이 꽤 좋다는 많은 진술이있다.

NSA는 FIPS-186-2 및 SHA-256로 지정된 타원 곡선 공개 키 암호화가 256 비트 프라임 계수 타원 곡선을 이용한 "것으로 지정 NSA에 따라 또한

, 기밀 레벨까지 를 기밀 정보를 보호하기에 적합합니다. 타원 곡선 및 SHA-384는 TOP SECRET 정보의 보호를 위해 필요한 384 비트 소수 계수의 사용합니다.

SHA512와 함께 HMAC 기능을 사용하는 것이 안전하다고 생각합니다.

+1

'PDBKDF2WithHmacSHA1'와'PDBKDF2WithHmacSHA512'의 가장 큰 차이점은 각각 다른 해시 길이 (160bits 대 512bits)가 생성된다는 것입니다. 그러나 PBEKeySpec (char [] password, byte [] salt, int iterationCount, int keyLength)의'keyLength' 인수가 생성 된 해시 길이를 제어하기 때문에 이것이 옳다고 생각하지 않습니다. '512','256','160'을 지정하면, 길이가 다른 각각의 해쉬를 얻습니다. – DTs

+0

"암호화에 충분한 양면에 인수가 있습니다." 어떤 링크라도 감사 할 것이고, 나는 그것을 읽고 싶다. 나는 'SHA1' 대'SHA512' 사이의 비교를 찾을 수 있지만'PDBKDF2WithHmacSHA1'과'PBKDF2WithHmacSHA512' 사이의 비교는 찾을 수 없습니다. Btw, 나는'SecretKeyFactory.getInstance ("PBKDF2WithHmacSHA512");를 수행하려고 시도했지만 원래'NoSuchAlgorithmException'을 던집니다. 'javax.crypto'에 포함되어 있지 않습니까? 나는 이것을 사용하고 싶지만 IAIK와는 별도로 제공자 제공 업체를 찾을 수 없다 (JCE 라이브러리에 수천 달러를 부과한다 ..). 다른 옵션을 알고있는 사람이 있습니까? – DTs

+0

생성 된 해시의 길이가 길면 "보다 안전한"해싱 방법의 표시기라는 의미가됩니다. 특정 유형의 공격에 대한 해시 길이의 영향에 대한 의견을 제시하지 않고 그러한 것들을 말하는 것은 오히려 추측입니다. 예를 들어, 해시 된 값 (예 : 암호)이 8 문자로 충분하면 암호 해시 방법의 출력이 얼마나 큰지는 알 수 없습니다. 충분히 빨리 계산할 수있는 한 무차별 한 -force 공격은 여전히 ​​가능합니다. –

관련 문제