2014-11-08 2 views
0

DefaultHashService와 함께 DefaultPasswordService와 함께 PasswordMatcher를 사용하려고합니다.Apache Shiro - 암호 형식 문제

DefaultHashService hashService = new DefaultHashService(); 
hashService.setHashIterations(10000); 
hashService.setHashAlgorithmName(Sha512Hash.ALGORITHM_NAME); 
hashService.setGeneratePublicSalt(true); 

DefaultPasswordService passwordService = new DefaultPasswordService(); 
passwordService.setHashService(hashService); 
String encryptedPassword = passwordService.encryptPassword("password"); 
System.out.println("Result:"+encryptedPassword); 

다음은 데이터베이스에 열 PASSWORD로 저장해야하는 결과입니다.

모든 것이 작동 $ shiro1 $ SHA-512 $ 10000 $ T5nkQEA3qjMLPuB/X + WN4Q == $ qWViYjBljsMwH7FSvhecKlxQqXY11lv8eS4guxD9t8D4HTeKclN/muyTnhzYZ + YvI1YkEg6L7T2kM3qykUG0XQ ==

. 그러나 내 질문에 왜 반복 번호와 알고리즘 이름이 소금과 암호로 저장됩니까? 이 경우 우리는 잠재적 인 공격자에게 정보를 제공합니다. 누가 그와 같은 중요한 속성에 대해 데이터베이스를 덤프합니다.

답변

1

, 우리는 경우에도 사용자 암호를 보호하는 것을 목표 : 잠재적 인 해커 원조에 대한 우려에 대해서는

는 해시 알고리즘에 개인 소금 문자열을 추가이를 회피하는 간단한 방법이있다 공격자는 모든 구현 비밀을 알고 있습니다. 이것은 " white-box encryption"로 알려져있다 : 같은 맥락에서

가하는 '화이트 박스 공격자가'암호화 알고리즘의 소프트웨어 구현에 대한 전체 액세스 권한을 가지고

이 : 바이너리가 공격자에 의해 완전히 볼 수 있고 변경 가능한; 공격자는 실행 플랫폼 (CPU 호출, 메모리 레지스터 등)을 완전히 제어 할 수 있습니다. 따라서 구현 자체가 유일한 방어선입니다. 당신은 공격자가 또한 그들이에 액세스 할 수있는 경우 가능성이없는 어쨌든 코드/바이너리에 액세스 (이 가정 가지고

말했다되고, 당신은 암호와 함께 해시 알고리즘 및 반복 수를 저장할 수 있습니다 데이터베이스).

해시와 함께 반복 횟수를 저장하면 다음과 같은 이점이 있습니다. 향후 처리 능력이 증가하므로 많은 수의 반복으로 변경할 수 있습니다. 이전 반복 수를 사용하여 모든 해시를 수행하고 추가 반복 횟수를 적용하고 데이터베이스에 새로운 결과를 저장하고보다 안전한 방식으로 업그레이드하여 데이터베이스를 쉽게 업그레이드 할 수 있습니다.

마찬가지로 해시 알고리즘을 해시에 추가하면 나중에 다른 암호 체계 (bcrypt, ...)로 쉽게 변경하고 다음 로그인시 사용자를 정상적으로 업그레이드 할 수 있습니다.

+0

대단히 감사합니다. 하지만 패스에서 가져온 경우 shiro에서 다음 설정을 지정하는 이유는 무엇입니까? hashService.hashIterations = 10000, hashService.hashAlgorithmName = SHA-512, hashService.generatePublicSalt = true. 불필요한가요? –

+0

나는 Shiro API에 익숙하지 않다.하지만 어느 경우 든 사용자를 위해 해시를 처음 생성 할 때 설정해야한다. Shiro가 생성 된 해시에서 파생시킬 수 있는지, 아니면 이러한 값을 제공합니다. –

+0

실제로 이러한 설정은 코드에 있어서는 안됩니다. DefaultPasswordService는 실제로 그것들을 사용하지 않습니다. https://stackoverflow.com/a/12902798/2969332 –

1

암호 서비스의 기본 알고리즘을 변경하면 이전에 생성 된 암호의 해시를 확인할 수 있습니다. 요즘

private static final String PRIVATE_SALT = "some_random_string_you_only_know"; 
... 
hashService.setPrivateSalt(new SimpleByteSource(PRIVATE_SALT)); 
관련 문제