2016-07-27 1 views
0

나는 백엔드 레일 앱에 연결하는 Android 앱을 가지고 있습니다. 기기와 서버 사이에 보내는 데이터를 암호화하고 싶습니다. 비밀 키로 기본 암호화를 사용하고 있습니다. 열쇠는 내가 apk에 저장하고 있기 때문에 비밀이 아니기 때문에 리버스 엔지니어링과 apk 디 컴파일 기술을 사용하여 쉽게 다루기가 쉽습니다."괜찮은"암호화 방식입니까?

나는 사용자의 암호를 기반으로 비밀 키를 생성하고 있습니다. Key는 고정 길이가되어야하며, 사용자가 옵션이 아닌 초고 암호를 사용하는 방법을 보면서, 내가하고있는 일은 문자 (기본적으로 이전의 하드 코딩 된 키에 사용했던 문자)를 추가하는 것입니다. 문자열 (암호 + 문자)은 필수 길이입니다. 그런 다음 사용자 이름 (기술적으로 암호화하지 않아야하므로 큰 문제는 아님)을 제외하고 모든 매개 변수를 암호화합니다 (서버 클라이언트 통신을 위해 JSON을 사용하고 있습니다). JSON 요청이 서버에 도달하면 사용자 이름 매개 변수를 사용하여 데이터베이스 (서버 기반)에서 사용자의 암호를 가져온 다음 키를 구성하여 내가받는 데이터를 "암호화 해제/암호화"해야합니다. 배상. 이렇게하면 키는 항상 Server/Client간에 동일하지만 모든 사용자에게 고유하므로 APK에 쉽게 가져올 수있는 하드 코딩 된 키를 저장할 필요가 없습니다. 또한 암호는 장치에 저장되지 않으므로 사용자는 서버에 로그인 할 때마다 암호를 입력해야합니다.

제가 알고 싶습니다.이 접근법을 "적절하게 보호"할 수 있습니까?

+0

사용자 이름이 고유합니까? 그렇지 않은 경우 동일한 사용자 이름의 인스턴스가 여러 개있는 경우 사용자 이름을 사용하여 암호를 검색하면 문제가 발생할 수 있습니다. 또한 사용자가 비밀번호를 변경하면 어떻게됩니까? 그런 다음 모든 데이터를 다시 암호화합니까 (암호화 된 상태로 암호화되었다고 가정). – Tim

+0

예, 사용자 이름은 고유합니다. –

+3

왜 https를 사용하지 않는가? – nasch

답변

1

https://en.m.wikipedia.org/wiki/RSA_(cryptosystem) 공개 키 (앱에 저장되어 있음)를 사용하여 데이터를 암호화 한 다음 서버는 개인 키 (서버에 저장 됨)를 사용하여 데이터를 해독합니다. RSA를 사용하면 공개 키를 사용하여 패킷을 암호화 할 수 없으며 암호 만 암호화합니다. 그래서 안전합니다. 각 클라이언트에 대해 키 쌍 (또는 키 집합)을 만들어야합니다.

+0

그런 생각으로 MITM 공격을 막을 수는 있지만 공격자가 공개 키를 가져와 요청을 보내면 서버가 공격자로부터 온 것인지 알 수 없습니다. 그것이 문제가되는지 여부는 영업 이익에 달려 있습니다. – nasch

+0

인증이 문제가되는 경우 개인 키를 사용하여 요청을 서명해야합니다. –

+0

공개 키 암호화를 사용하여 인증을 위해 사용자 이름/암호와 같은 비밀 정보를 전달하는 데 사용할 수있는 대칭 키 암호 세션을 설정합니다. –

1

사용자 관점에서 볼 때 보안 관점에서보기가 좋지만 품질이 낮을 수 있습니다. 또한 사용자의 암호에서 고정 길이 문자열을 생성하기 위해 해시 함수를 사용할 수 있습니다.

또 다른 방법은 런타임에 암호화 키를 검색하여 Android Keystore에 저장하는 것입니다. Android Keystore에 액세스하는 것은 공격자가 키에 액세스하는 것이 훨씬 어렵습니다. 또한이 방법을 사용하면 사용자가 앱을 사용할 때마다 비밀번호를 입력 할 필요가 없습니다. 그러나 대칭 키를 처음으로 교환 할 때이 접근법은 MitM attack의 영향을받습니다. 이 문제를 해결하려면 먼저 비대칭 암호화 기법을 사용하여 대칭 키를 안전하게 교환해야합니다. 그런 다음 키 저장소에 저장된 키를 항상 사용할 수 있습니다.

비대칭 방법은 대개 프로세서 집약적이며 모바일 장치의 경우 배터리를 특히 많이 사용하므로 네트워크 트래픽을 암호화/해독하는 데 비대칭 인 cypto를 사용하면 안됩니다.

그러나 제 생각에는 최선의 방법은 TLS 솔루션을 사용하는 것입니다. 사전 공유 키 (즉, 대칭 키)에 동의하는 TLS에서 RSA 알고리즘이 사용되면 모든 트래픽이 대칭 알고리즘을 사용하여 암호화/해독됩니다.

0

당신이 원하는 경우에 당신은 항상 암호 기반 키 유도 알고리즘을 사용할 수는 : https://en.wikipedia.org/wiki/PBKDF2

에 대해 생각하는 것은, 그러나, 당신의 키 순환 일정을 자동으로 암호를 회전 일정과 동일합니다 여부입니다.

0

"암호"를 기반으로 동일한 대칭 키를 사용하기 만하면 클라이언트와 서버가 필요합니다. 맞습니까? 왜 각 끝의 암호에서 키를 가져 오는 것이 아닙니다.

클라이언트는 암호를 묻는 메시지를 표시 한 다음 좋은 임의의 소금 (각 연결마다 고유 한 암호)을 만들고 많은 수의 반복을 사용하여 보안 키를 생성합니다.

클라이언트는 솔트와 반복 횟수를 서버에 보냅니다. 서버는 암호 사본을 찾습니다 (해시가 아닌 암호를 저장한다고 가정). salt 및 iterations를 사용하여 일치하는 대칭 키를 생성합니다.

연결 당 고유 한 소금은 시도하기 위해 미리 파생 된 키 세트를 준비하기 어렵게하며 반복 횟수가 많으면 서버에 사전 공격을 수행하는 데 많은 시간이 소요됩니다 (즉,).

관련 문제