문제

데이터 액세스 계층에 Spring & Hibernate (JPA)가 포함 된 Java 응용 프로그램 스택에서 비밀번호 암호화 (주석을 사용하여)를 적용하는 좋은 방법은 무엇이며 (자습서 등) 더 많은 정보를 찾을 수있는 방법은 무엇입니까?

내가 사용한다는 것이 이해됩니다 JCA 암호를 암호화하기위한 지원 된 알고리즘이지만 쉬운 방법이 있으면 래퍼 로직을 구현할 필요가 없습니다.

나는 jasypt를보고 있었고, a) 그것이 좋은 선택인지, 어떻게 해야하는지, 그리고 b) 다른 사람들이 이것을 위해 사용하는 것을 궁금해했다. 누군가가 jasypt 또는 대안을 사용하는 경우 경험에 대한 세부 사항이 좋을 것입니다.

도움이 되었습니까?

해결책

Java에는 이미 필요한 모든 라이브러리가 제공됩니다. 다음과 같이 설명한대로 소금으로 해싱을 구현하는 유틸리티 방법을 만듭니다. OWASP.

실제로 해당 코드를 소유하고 싶지 않고 추가 의존성을 신경 쓰지 않는다면 시로 도서관 (이전 JSecurity)가 있습니다 구현 OWASP가 묘사 한 것.

또한 언급 한 Jasypt 라이브러리에 비슷한 유틸리티.

이 답변은 Spring이나 최대 절전 모드를 언급하지 않지만이 시나리오에서 어떻게 활용하기를 희망하는지 명확하지 않습니다.

다른 팁

당신이 사용할 수있는 최대 절전 모드와 Jasypt 그것이 당신이 찾고있는 경우, 당신의 속성을 즉석에서 암호화하거나 해시하는 것입니다. 다이제스트를 컴퓨팅하기위한 실제 알고리즘 (해시)은 자신의 롤을 롤하려면 JCE를 사용하여 매우 간단합니다.

MD5는 현재 금이 갈 수 있지만 MD5 또는 SHA-256은 괜찮을 것입니다.

어쩌면 문제를 오해했지만 해시 암호를 비교해야합니다.

최대 절전 모드에서는 문자열로 보관하십시오. 유효성 검사 측면에는 다음과 같은 방법이 있습니다.

public validate(String user, String pass)
{
    if(getUser(user).getPass().equals(getHash(pass)))
        return true;
    return false;
}

jasypt와 함께 할 수있는간에 특정 방법이없는 것 같지만 봄에 암호 암호화자를 설정할 수 있습니다.

  <!-- 
   Set up string digester here so we can configure it for more pools if it's a problem... 
  -->
  <bean id="stringDigester" class="org.jasypt.digest.PooledStringDigester">
    <!-- same settings as StrongPasswordGenerator -->
    <property name="poolSize" value="2"/>
    <property name="algorithm" value="SHA-256"/>
    <property name="iterations" value="100000"/>
    <property name="saltGenerator">
      <bean class="org.jasypt.salt.RandomSaltGenerator"/>
    </property>
    <property name="saltSizeBytes" value="16"/>
  </bean>

  <!-- ...and then we only have to deal with the passwordEncryptor interface in code. -->
  <bean id="passwordEncryptor" class="com.myproject.util.StringPasswordEncryptor">
    <property name="stringDigester" ref="stringDigester"/>
  </bean>

그런 다음 Context.getBean ( "PasswordenCryptor")을 호출하여 암호화자를 얻은 다음 EncryptPassword () 또는 CheckPassword ()를 호출하십시오.

응용 프로그램에서 스프링을 사용하는 경우 사용할 수도 있습니다. 봄 보안, 몇 가지 암호 인코더를 제공합니다. Shapasswordencoder당신은 그것을 찾을 수 있습니다 스택 오버플로

나는 그냥 비슷한 것을 사용합니다 SHA-256(username + ":" + password + ":" + salt) 데이터베이스에 Passwd라는 64 자 열에 저장하십시오.

Wikipedia는 소금과 관련하여 다음과 같이 말합니다. "소금 데이터는 사전 항목의 사전 암호화를 사용하는 사전 공격을 복잡하게 만듭니다. 각 소금의 각 비트는 필요한 저장량과 계산의 양을 두 배로 늘립니다. ... 최상의 보안을 위해 소금 값은 비밀로 유지됩니다. 비밀번호 데이터베이스와 분리되어 있습니다. 이것은 데이터베이스를 도난 당할 때 이점을 제공하지만 소금은 그렇지 않습니다. "

따라서 인증하려면 공급 된 사용자 이름을 사용하여 데이터베이스에서 사용자를 가져온 다음 로그인 시도를 통해 제공된 비밀번호를 사용하여 동일한 해시를 생성 한 다음 데이터베이스와 비교하십시오. 또한 로그인 시도에 대한 일부 요금 제한 (예 : 5 분당 5)을 추가하십시오. 사용자가 암호를 잊어 버린 경우 비밀번호를 이메일로 보내지 않거나 (저장되지 않은대로) 새 생성 비밀번호를 이메일로 보내지 말고 암호 변경 키/Nonce/Salt를 사용하여 해당 비밀번호를 변경할 수있는 링크를 이메일로 보내십시오. 확인할 수있는 URL.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top