문제

iPhone의 모든 SQLite 데이터베이스는 단순히 응용 프로그램과 함께 번들로 제공되는 파일입니다.누구나 이 파일을 추출하고 쿼리하는 것은 비교적 간단합니다.

데이터베이스에 저장된 파일이나 데이터를 암호화하기 위한 제안 사항은 무엇입니까?

편집하다: 앱은 다른 사용자와 대결하는 게임입니다.사용자의 상대적인 강점과 약점에 대한 정보는 DB에 저장됩니다.나는 사용자가 휴대폰을 탈옥하여 평판/파워 등을 높이고 토너먼트/리그 등에서 우승하는 것을 원하지 않습니다(주의:아이디어가 NDA에 있으므로 모호하게 노력하고 있습니다.

군사 암호화는 필요하지 않으며 일반 텍스트로 내용을 저장하고 싶지 않습니다.

편집 2: 좀 더 명확하게 말하면 내 주요 목표는 다음과 같습니다.

  1. 민감한 데이터를 해킹하는 것이 사소하지 않게 만드세요
  2. 데이터가 변경되었는지 확인하는 간단한 방법(일종의 체크섬)
도움이 되었습니까?

해결책

고객, 기간을 신뢰할 수 없습니다. 독립형 앱이 해독 할 수있는 경우도 해독 할 수 있습니다. 통계를 향상시키기 위해 실제로 깨진 사람들의 수는 미미할 것이므로 어쨌든 노력에 대한 보상을 받아야 할 것이므로 서버에 데이터를 넣거나 귀찮게하지 마십시오!

"제발 속임수를 쓰지 마라"라는 데이터베이스에 문자열을 넣으십시오.

다른 팁

암호화 값이나 메모리 내 데이터베이스를 피하는 두 가지 더 쉬운 접근 방식 (무료)이 있습니다.

#1- IPA 균열 감지

데이터베이스 및/또는 내용을 암호화하는 기술적 (및 법적) 번거 로움을 피하고 앱이 불법 행위인지 확인하고 게임의 네트워크/스코어링/순위 측면을 비활성화하십시오. 자세한 내용은 다음을 참조하십시오.

http://thwart-ipa-cracks.blogspot.com/2008/11/detection.html

#2- 데이터 무결성 검증

또는 데이터를 저장할 때 (및 초기 SQLITE DB)를 저장할 때 각 행에 중요한 열의 HMAC/SALTED 해시를 저장하십시오. 각 행을로드 할 때 HMAC/HASH에 대한 데이터를 확인하고 확인이 실패한 경우 그에 따라 작동합니다.

어느 접근 방식도 Apple/미국 정부가 요구하는 암호화 수출 양식을 작성하도록 강요하지 않습니다.

점수 제출

앱 이외의 다른 것으로부터 오는 값으로부터 보호하기 위해 실제 점수 제출에 대해 유사한 일을해야한다는 것을 잊지 마십시오. Cocos2d-Piphone 및 Cocoslive 프레임 워크 에서이 구현을 볼 수 있습니다. http://code.google.com/p/cocos2d-iphone/ 그리고 http://code.google.com/p/cocoslive/

의견에 대한 응답

여기에는 데이터 변조를 100% 방지하는 해결책이 없습니다. 그것이 요구 사항 인 경우, 클라이언트는 만보아야하며 모든 상태 및 논리는 신뢰할 수있는 서버에서 계산되어야합니다. 응용 프로그램에 따라 클라이언트에 추가 방지 메커니즘이 필요합니다.

이러한 문제에 대해 논의하는 대규모 다중 지역 게임 개발에 관한 많은 책이 있습니다.

코드에 알려진 비밀이있는 해시를 갖는 것은 합리적인 접근 방식 일 수 있습니다 (적어도 App Store에 일반적으로 존재하는 응용 프로그램 유형을 고려할 때).

Kendall이 말했듯이, 장치의 키를 포함하여 기본적으로 금이 가라고 요구하고 있습니다. 그러나 주요 기기로 데이터를 난독 화 해야하는 이유가있는 사람들이 있습니다. 당신이 그것을하기로 결정했다면, 당신은 사용을 고려할 수 있습니다 sqlcipher 구현을 위해. 전체 DB의 투명한 페이지 수준 암호화를 제공하는 SQLITE의 빌드입니다. 거기에 모바일 과수원에 대한 튜토리얼 iPhone 앱에서 사용합니다.

일반 사용자가 이 작업을 수행할 가능성은 얼마나 된다고 생각하시나요?나는 당신이 앱 스토어를 통과한다고 가정합니다. 이는 사용자의 장치에 접근하기 전에 모든 것이 서명/암호화된다는 것을 의미합니다.데이터베이스에 액세스하려면 장치를 탈옥해야 합니다.

암호화가 필요할 정도로 어떤 종류의 데이터를 저장하고 있나요?사용자가 입력한 비밀번호가 포함되어 있으면 실제로 암호화할 필요가 없습니다.사용자는 자신의 비밀번호를 알아낼 필요가 없습니다.사용자가 애플리케이션을 통해서만 액세스할 수 있는 일반 BLOB 데이터인 경우 다음을 사용하여 암호화된 BLOB을 저장하는 것만큼 간단할 수 있습니다. 보안 API.

보안을 원하는 것이 전체 데이터베이스라면 여전히 보안 API를 사용하고 싶지만 대신 전체 파일을 사용하고 파일을 열기 전에 필요에 따라 파일의 암호를 해독해야 합니다.여기서 문제는 응용 프로그램이 정리 없이 종료되면 해독된 파일이 남게 된다는 것입니다.

메모리 상주 데이터베이스나 템플릿 DB 또는 프로그램의 하드 코딩된 스키마를 사용하여 생성할 수 있는 임시 데이터베이스를 살펴볼 수 있습니다. sqlite3_open).데이터를 해독하여 임시 데이터베이스에 삽입한 다음 해독된 데이터베이스를 삭제할 수 있습니다.연결을 닫을 때는 반대 방향으로 하십시오.

편집하다:

앱에 저장된 값과 데이터를 XOR하고 해시를 다른 곳에 저장하여 변경되지 않도록 하는 매우 간단한 보안 시스템만으로 자신만의 암호화 체계를 구성할 수 있습니다. .

sqlcipher :

내 경험을 바탕으로 SQLCIPHER는 데이터베이스를 암호화하는 최선의 선택입니다.

키 ( "Pragma Key")가 설정되면 SQLCIPHER가 데이터베이스의 모든 데이터를 자동으로 암호화합니다! 키를 설정하지 않으면 SQLCIPHER는 표준 SQLITE 데이터베이스와 동일하게 작동합니다.

SQLITE3_KEY 또는 "PRAGMA 키"호출은 데이터베이스를 열린 후 첫 번째 작업으로 발생해야합니다. 대부분의 경우 SQLCIPHER는 암호화 키를 얻기 위해 소금에 절인 및 반복 된 키 도출 함수 인 PBKDF2를 사용합니다. 또는 응용 프로그램은 SQLCIPHER에 Blob 표기법의 특정 이진 키를 사용하도록 지시 할 수 있습니다 (SQLCIPHER는 정확히 256 비트의 키 재료가 필요합니다)

enter image description here

참조:

http://sqlcipher.net/ios-tutorial

나는 누군가가 이것에 대해 탐구하는 데 시간을 절약하기를 바랍니다.

철학적 문제와 수출 문제를 무시하고 테이블의 데이터를 직접 암호화하는 것이 더 나을 것을 제안합니다.

코드에서 암호 해독 키를 난독화해야 합니다.일반적으로 이는 키를 조각으로 나누고 문자열을 16진수로 인코딩하고 함수를 사용하여 키 조각을 함께 조립하는 것을 의미합니다.

알고리즘의 경우 사용 중인 언어에 관계없이 신뢰할 수 있는 AES 구현을 사용하겠습니다.C#에 대한 내용은 다음과 같습니다.

http://msdn.microsoft.com/en-us/magazine/cc164055.aspx

마지막으로 접근 방식의 한계를 인식해야 합니다.즉, 암호 해독 키는 약한 링크이므로 런타임 시 일반 텍스트로 메모리에서 사용할 수 있습니다.(최소한) 사용이 가능하도록 되어 있어야 합니다.암호화 체계의 구현은 또 다른 약점입니다. 모든 결함은 코드에도 결함이 있습니다.다른 여러 사람들이 지적했듯이 클라이언트-서버 통신도 의심스럽습니다.

컴파일된 코드인 임의의 정크에서 일반 텍스트 문자열이 튀어나오는 16진수 편집기에서 실행 파일을 검사할 수 있다는 점을 기억해야 합니다.그리고 많은 언어(예: C# 등)는 역컴파일될 수 있으며 누락되는 것은 주석뿐입니다.

즉, 데이터를 암호화하면 부정 행위에 대한 기준이 조금 높아질 것입니다.얼마나 조심하느냐에 따라 금액이 달라집니다.하지만 그럼에도 불구하고 단호한 적이라면 여전히 암호화를 깨고 속임수를 쓸 것입니다.게다가, 그들은 아마도 당신의 게임이 인기가 있다면 이를 쉽게 할 수 있는 도구를 작성할 것입니다.그 시점에서 군비 경쟁 시나리오가 남습니다.


체크섬 값과 관련하여 데이터베이스에 충분한 숫자 값이 있다고 가정하면 행의 값 합계를 기반으로 체크섬을 계산할 수 있습니다.또는 여러 부울 값의 경우 이를 varbinary 필드에 저장하고 비트 배타적 연산자 ^를 사용하여 비교할 수 있습니다. 결국 0이 되어야 합니다.

예를 들어,

숫자 열의 경우

2 | 3 | 5 | 7 | 점검 열 | 17 |

부울의 경우

0 | 1 | 0 | 1 | 점검 열 | 0101 |

이렇게 하면 마지막에 체크섬을 합산하는 요약 행을 추가할 수도 있습니다.새 레코드를 지속적으로 추가하는 경우에는 문제가 될 수 있습니다.문자열을 ANSI/UNICODE 구성 요소로 변환하고 합산할 수도 있습니다.

그런 다음 체크섬을 간단하게 확인하려면 다음과 같이 선택하십시오.

Select * 
FROM OrigTable 
right outer join 
(select pk, (col1 + col2 + col3) as OnTheFlyChecksum, PreComputedChecksum from OrigTable) OT on OrigTable.pk = OT.pk
where OT.OnTheFlyChecksum = OT.PreComputedChecksum

모든 토너먼트 결과를 토너먼트에서 모든 iPhone과 동기화하는 것이 가장 간단한 것으로 보입니다. 게임마다 할 수 있습니다. 게임 전에 두 전화의 데이터베이스가 서로 모순되면 경고가 표시됩니다.

사용자 A가 사용자 B와 함께 게임을 할 경우 결과를 위조하면 A의 데이터가 자신의 휴대 전화와 일치하지 않는다는 경고로 B가 나타날 때 까지이 결과는 전파됩니다. 그는 갈 수 있습니다 이겼다 그의 행동이 옳지 않다는 것을 설명하십시오. 누군가가 속이는 경우 실제 생활 방식입니다.

최종 토너먼트 결과를 계산할 때 경고, 이름 이름을 표시하며 모순 된 결과로 모든 게임을 버리십시오. 이것은 속임수의 인센티브를 제거합니다.

앞에서 말했듯이, 암호화는 고객을 신뢰할 수 없기 때문에 문제를 해결하지 못합니다. 평범한 사람이 불쾌한 사람을 사용할 수 없더라도 동기 부여 된 사람과 당신이 가진 암호화가 깨질 수 있습니다.

그러나 Windows 플랫폼에서는 또한 sqliteencrypt SQLITEENCRYPT는 SQLITE 암호화 지원을 확장하지만 원래 SQLITE3 C 라이브러리로 취급 할 수 있습니다.

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