2

나는 "클래스"프로필을 확장하는 "사용자 프로필"과 "FingerprintProfile"클래스를 가지고 있습니다.클래스에서 비밀번호를 저장하는 가장 바람직한 방법 - Java

프로필 :

내 다음 수업이 클래스는 사기 것,이 같은 암호를 (심지어 경우 검색 할 수 있도록 완전히 잘못된 것 같다에서 그냥보고 USERPROFILE

public class UserProfile extends Profile { 

    /** 
    * Users password 
    */ 
    private char[] password; 

    /** 
    * Set User password 
    * @param password 
    */ 
    public void setPassword(char[] password){ 

     this.password = password; 

    } 

    /** 
    * Get User password 
    */ 
    public char[] getPassword(){ 

     return password; 

    } 

} 

입니다

/** 
* Template for User profiles or Fingerprint profiles 
*/ 
public abstract class Profile { 

    /** 
    * Profile Name 
    */ 
    private String name; 

    /** 
    * Profile id 
    */ 
    private int id; 

    /** 
    * Set the name of this profile 
    * @param name 
    */ 
    public void setProfileName(String name) { 
     this.name = name; 
    } 

    /** 
    * Set the id of this profile 
    * @param name 
    */ 
    public void setIdNumber(int id) { 
     this.id = id; 
    } 

    /** 
    * Get the name of this profile 
    */ 
    public String getProfileName() { 

     return name; 

    } 

    /** 
    * Get the id of this profile 
    */ 
    public int getIdNumber() { 
     return id; 
    } 

} 

get 메소드는 개인입니다.

내 FingerPrintProfile 클래스를 만들 때 동일한 문제에 직면하게 될뿐만 아니라 본질적으로 보안이 필요한 "FingerprintData"개체를 보유하고있는 것으로 보입니다.

보안 방법이나 사람이이 시나리오와 같은 시나리오를 해결하는 데 사용하는 패턴을 알고있는 사람이 있습니까?

감사합니다.

보너스 상담자 프로필의 두 가지 유형의 템플릿을 제공하는 추상 클래스를 만들어, 지문 데이터와 텍스트 암호 사이에 공통점이있는 것 같다. 그러나 문자 배열이나 FingerprintData 객체가 될 수있는 추상 필드 "password"를 만들 수는 없습니다. 어떤 아이디어?

+0

암호가 암호화되어 있습니까? –

+0

'char [] setPassword()':) – UmNyobe

+0

암호가 암호화되어 있지 않다면, 내가봤을 때의 발전 단계가 무엇인지 알아 보겠습니다. – TomSelleck

답변

4

대신 "개체 생각"을 사용하십시오. 현재 디자인은 OOP가 아닙니다. 암호를 설정하고 가져 오는 대신 이 프로필의 동작을 노출해야합니다. 예 :

interface Profile { 
    void rename(String name); 
    String identity(); 
    boolean authenticate(char[] password) 
} 

Getters/setters는 OOP에서 안티 패턴입니다.

+0

구체적인 클래스의 이름/비밀번호 입력란을 작성해야합니까? – TomSelleck

+0

도 지문과 사용자의 각 클래스에 대해 서로 다른 인증 방법을 사용할 수 있습니까? – TomSelleck

+1

사용자를 인증 (또는 거부)하는 데'authenticate()'가 제공된 암호를 사용하는 방법은 구현에 달려 있습니다. 요점은 클래스가 getter를 통해 암호를 노출하지 말고 캡슐화하고 비헤이비어를 노출해야한다는 것입니다. – yegor256

7

암호로 작업 할 때 암호가 일반 텍스트로 저장되지 않도록 일부 형식의 암호화를 사용해야합니다. 이 작동 방식에 대한 내용은 here에서 확인할 수 있습니다.

Here은 Bcrypt의 Java 구현에 대한 링크로, 최소한 시작해야합니다.

5

보안 방법이나 사람이이 시나리오와 같은 시나리오를 해결하는 데 사용하는 패턴을 알고있는 사람이 있습니까?

"무엇으로부터 안전합니까?"

확실히이 클래스와 동일한 JVM에서 일부 신뢰할 수없는 코드가 실행되면 암호를 확보 할 수 있습니다. 그런데 왜 그런 일이 일어나도록 내버려 두시겠습니까?

  • 동일한 JVM에서 전체 권한으로 실행되는 신뢰할 수없는 코드에 대해 메모리 내 데이터를 보호 할 수 없습니다.

  • 주의하면 보안 샌드 박스에서 실행되는 신뢰할 수없는 코드로부터 데이터를 보호 할 수 있습니다. 예 : 사용자 정의 Permission을 작성하고 SecurityManager을 사용하여 getPassword 메소드의 호출자에게 필수 권한이 ​​있는지 확인하십시오. (그리고 당신도 몇 가지 다른 일을 할 필요가 ...)


암호를 처리하는 "가장 좋은 방법"방법은 생성하고 정말 (사용 시드 해시를 저장하는 것입니다, 그런 말로 미루어 보아,) 안전한 해싱 알고리즘. 당신은 여기서 똑같은 일을 할 수 있습니다.잡스는 암호가 실제로 필요하다면 작동하지 않을 것입니다. 왜냐하면 해시의 전체 개념은 암호를 복구하기가 불가능하기 때문입니다. 그러나 반대로 암호가 분명하면 악의적 인 사람이 암호를 포착 할 수 있습니다.

암호화 된 암호 저장은 JVM의 신뢰할 수없는 코드에 대해 안전하지 않습니다. 신뢰할 수없는 사람과 나쁜 사람 사이의 시간, 노력 및 비밀 정보 채널이 제공되면 사용 된 키와 알고리즘을 복구하여 데이터를 해독 할 수 있어야합니다. 그리고 악의적 인 사람은 잠재적으로 코어 덤프를 통해 또는 JVM 프로세스의 페이징 파일을 읽음으로써 정보를 확보 할 수 있습니다.

결론은 플랫폼 보안이 (JVM 또는 OS 중 하나) 위반 된 경우 암호화되지 않은 상태로 보관되거나 암호가 안전하게 유지된다는 것을 보장 할 수 없다는 것입니다.

+0

답장을 보내 주셔서 감사합니다, 그게 내가 "잘못"된 것처럼 말한 것입니다. 객체 필드가 ​​일반 텍스트로 암호를 저장할 수있는 것처럼 보이지 않았습니다. 암호를 저장하는 OS가 아닌 경우 응용 프로그램을 사용해야하는 이유는 무엇입니까? – TomSelleck

관련 문제