2009-12-02 3 views
2

나는 많은 파라미터를 기반으로 시리얼 코드를 생성하는 자바 메소드를 가지고 있습니다.시리얼 코드의 정확성을 확인하십시오.

이제는 동일한 매개 변수 + 직렬 코드를 허용하는 다른 방법을 사용하고이 직렬 코드의 정확성 여부를 알려줍니다. 그러나 직렬 코드 작성 방법을 드러내고 싶지 않으므로 다른 사람이 정확성을 검사하는 방법을 알고 있으면 다른 매개 변수를 기반으로 새 코드를 작성할 수 없어야합니다.

이것이 가능합니까?

몇 가지 중요한 정보. 직렬 코드를 생성하는 방법을 변경할 수 없습니다. 그렇지 않으면 몇 가지 표준 공개 - 개인 키 알고리즘을 사용할 수 있습니다. 내가 원하는 것은 :

그것은 내가 필요한 것입니다. 문제는 내가 개인 키를 선택할 수 없다는 것입니다. 이것은 변경할 수없는 방법입니다.

methodICannotChange("someinput") returns serialcode 
methodICanInvent(serialcode, "someinput") returns true or false 

그리고 methodICanInvent의 구현을 할 때 새로운 serialcode를 생성하는 것은 불가능합니다.

+0

참고 : http : // stackoverflow.com/questions/559163/whats-a-good-approach-for-a-simple-serial-number-generator-verifier – finnw

+0

감사합니다. 나는 이것이 정확히 내가 원하는 바가 아니지만 여기에있는 첫 번째 대답은 매우 유용 할 것이라고 생각한다. – Fortega

+0

문제는 주어진 제약 조건 하에서 본질적으로 해결할 수 없다. 직렬 코드 생성 알고리즘은 길이가 12 자이고 인쇄 가능한 ASCII 코드를 생성 할 수 있다고 가정합니다. ASCII 값의 합은 256의 배수입니다. 모든 검사 코드는 유효한 코드를 거부하거나 잘못된 코드를 수락하거나 알고리즘을 표시합니다. – MSalters

답변

0

SerialCode 개체가 없습니까? 생성자에 매개 변수를 전달하십시오. 매개 변수가 유효한 경우 SerialCode 개체가 인스턴스화됩니다. 그렇지 않으면 생성자가 실패합니다.

이렇게하면 모든 SerialCode 개체가 유효한 일련 번호를 나타냅니다. 귀하의 클라이언트는 의 유효성을 인스턴스화 된 SerialCode 오브젝트를 소유함으로써 주장 할 수 있습니다.

SerialCodeFactory을 제공하여이 객체를 만들 수 있습니다 (팩토리/팩토리 메소드에 대한 정보는 here 참조).이 객체는 클라이언트에 공개하지 않고 패키지 범위 지정 또는 다른 방법을 통해 SerialCode 객체 만 표시 할 수 있습니다.

+0

나는 이것이 내 문제를 해결하지 못하는 것에 대해 사과하고 있습니다. 누군가가 자신의 클래스 파일을 디 컴파일하여 쉽게 자신의 시리얼 코드를 쉽게 만들 수 없도록하고 싶습니다. – Fortega

2

직렬 코드의 보안은 알고리즘 (즉, 알 수없는 알고리즘을 가짐) 및 "공용"입력 매개 변수에 대한 지식에 의존해서는 안됩니다.

그것은 단지 잠금 및 키 아래 지킨 비밀에 의존한다 : 비밀을 모르는 알고리즘의

serialNumber(input parameters, secret) -> serial number 

사용자가 아닌 비밀을 추측하거나 유용한 시리얼을 생산 할 수 있어야 비밀없이 경제적으로 흥미로운 시간대에있는 숫자.

보안 해시 함수은 요구 사항을 충족하도록 설계되었습니다.

serialNumber(parameters, secret) = md5(parameters & secret) 
verify(parameters, secret, serialNumber) = md5(parameters & secret) == serialNumber 

보안 요구 사항에 따라 다중 컨텍스트에 대해 하나의 글로벌 암호 또는 다중 암호가 필요합니다.

이 솔루션은 일련 번호 생성 및 확인이 같은 장소에서 수행되는 경우에만 작동합니다. (그렇지 않으면 공개 키 암호화가 사용되어야합니다.)

+0

안녕하세요, verify 메소드는 고객이 쉽게 읽을 수 있기 때문에 일련 번호를 만들 수 없어야합니다 (클래스 파일의 분해 사용) – Fortega

+0

나는 client-server-scheme을 염두에두고 있습니다. 연속 번호는 동일한 위치에서 작성되고 검증됩니다. 신뢰할 수없는 곳에서 일련 번호를 확인할 수 있어야하는 경우 공개 키 암호화를 사용해야합니다. –

3

기본적으로 사용자 정의 hash function을 생성합니다. 지정된 다이제스트가 주어진 입력 데이터와 일치 할 경우에만 해시 함수가 응답 할 수 있습니다. 나는. 누구나 데이터의 다이제스트를 만들 수 있습니다.

정말 원하는 내용은 digital signature입니다. 나는. 일반적인 생각은 다음을 수행하는 것입니다 :

  1. 개인 및 공개 키를 생성하십시오.
  2. 모든 클라이언트에 공개 키를 노출합니다.
  3. 데이터의 다이제스트를 만들고 데이터에 개인 키를 사용하여 데이터 을 클라이언트에 전달해야합니다.
  4. 클라이언트의 공개 키로 다이제스트 암호화 된 메시지를 복호화 는 메시지 다이제스트를 계산 전달 동일하다는 주어진 데이터 및 점검 다이제스트 계산;

.l.e. 클라이언트는 자신의 공개 키를 사용하여 해독 할 수있는 경우 서버에서 수신 한 다이제스트가 맞는지 확인할 수 있습니다.

+0

문제는 입력을 기반으로 직렬 코드를 생성하는 방법을 수정할 수 없습니다. (질문에 약간의 추가 정보를 추가했습니다 : 위 참조) – Fortega

0

당신이 시도하는 것이 가장 힘들며 항상 코드를 해킹 할 수있는 사람이 있으며 키 생성기를 만들거나 패치를 적용하여 일련 번호 확인을 비활성화하십시오.

당신은 그들의 삶을 어렵게 만들 수 있습니다 : 일련 번호의 생성에 대한

  1. 하는 당신이 개인 키를 사용하여 번호를 생성 곳 비대칭 알고리즘을 사용하여 (클라이언트에서) 그것을 확인 공개 키. 필자는 라이센스 파일이 공급 업체에서 디지털 서명 된 솔루션을 보았으며 응용 프로그램은 파일이 존재하고 올바르게 서명되었는지 확인합니다.
  2. 코드를 난독 처리하십시오. 이것은 디 컴파일을 막지는 못하지만 많은 해커들이 모호한 코드를 분석 할 가치는 없다고 생각합니다.
2

digital signature을 사용하면 총알을 교정 할 수 있습니다. 직렬 코드를 작성하는 코드는 고객에게 공개 할 필요가 없습니다. 귀하의 경우에는

alt text

데이터 부분은 매개 변수 (I 사용자 이름을 추측) mentionend 될 것이다. 이것을 문자열 표현으로 변환 할 수 있습니다 (문자열을 쉽게 해시 할 수 있음). 서명은 고객에게 제공하는 일련 번호입니다.

클라이언트 코드에서 디지털 서명/직렬 키는 주어진 매개 변수와 직렬 키만을 사용하여 유효성을 검사 할 수 있습니다. 물론 공개 키와 프라이버시 키를 만들어야합니다. 공개 키는 고객에게 공개되는 코드에 포함되어야합니다. 개인 키는 안전하게 보관해야합니다.

디지털 서명을 만드는 데 도움이되는 클래스가 있습니다. Look here for a tutorial.

+0

위와 같은 설명 : 시리얼 코드 메소드가 이미 정의되어있어서 변경할 수 없습니다. 이 코드는 사용자에게 배포되는 일련 번호를 반환합니다. 사용자가 이미 직렬 코드를 가지고 있다고 가정 해보십시오. – Fortega

0

비대칭 암호화를 사용하여 직렬 코드 생성을 변경할 수 없다고 가정하면 유효성 검사를 웹 서비스로 옮길 것입니다. 따라서 methodICanInvent (serialcode, "someinput")는 유효성 검사를 수행하는 웹 서비스를 호출하고 true 또는 false를 반환합니다.

이유는 사용자가 키 생성기에 대한 정보를 수집하는 데 사용할 수있는 유효성 검사 코드를 쉽게 디 컴파일 할 수 있기 때문입니다.