안전하지 않은 암호화 문제 해결하기

이 정보는 안전하지 않은 암호화 패턴이 포함된 앱의 개발자를 대상으로 합니다. 암호문이 정적으로 계산된 보안 키, 솔트 또는 초기화 벡터(IV)로 생성된 경우 안전하지 않다고 간주됩니다. 안전하지 않은 암호화의 위치는 앱에 관한 Play Console 알림에서 확인할 수 있습니다. 

'안전하지 않은 암호화 패턴' 알림 해결 방법 

앱에서 암호화 작업에 정적으로 계산된 키, 초기화 벡터 또는 솔트가 사용되었는지 검토하고 이러한 값이 안전하게 구성되었는지 확인합니다. 예를 들어, 다음 코드에는 정적 계산이 가능한 보안 키와 초기화 벡터가 사용되었습니다.

   // Console 알림은 이 방식을 가리킴
  public byte[] encryptionUtil(String key, String iv, byte[] plainText) {
    Cipher cipher = Cipher.getInstance(“AES/GCM/NoPadding”);
    SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(), “AES”);
    GCMParameterSpec paramSpec = new GCMParameterSpec(256, iv.getBytes());
    cipher.init(Cipher.ENCRYPT_MODE, keySpec, paramSpec);
    return cipher.doFinal(plainText);
  }

  // 여기에 안전하지 않은 키와 초기화 벡터가 사용되었으므로 변경해야 함
  byte[] cipherText = encryptionUtil(“abcdef...”, “010203040506”, plainText);

정적으로 계산된 값
정적으로 계산된 값은 앱을 실행할 때마다 동일한 값입니다. 정적으로 계산된 암호화 값은 앱에서 추출되어 앱의 암호화된 데이터를 공격하는 데 사용될 수 있습니다. 사용 전에 복잡한 방식으로 키, 초기화 벡터, 솔트를 조작하더라도 프로그램이 실행될 때마다 이러한 조작이 동일하게 이루어질 경우 여전히 안전하지 않습니다.

Android 권장사항
대칭형 암호화에는 Jetpack Security를 활용하는 것이 좋습니다. 앱에서 API 키, 개인 식별 정보(PII) 등의 민감한 정보를 암호화할 경우 EncryptedSharedPreferences를 사용하면 보안 키, 초기화 벡터, 솔트 구현에 신경 쓰지 않고도 이러한 데이터를 안전하게 저장할 수 있습니다. 이 페이지에서 다른 권장사항과 예시를 확인해 보세요. 데이터를 다른 시스템으로 안전하게 전송하려면 개발자는 전송되는 데이터를 TLS/SSL로 보호해야 합니다. 

Jetpack Security는 Google 오픈소스 프로젝트인 Tink를 활용하여 인증된 대칭형 암호화를 처리합니다. 낮은 수준의 암호화 작업과 관련된 고급 사용 사례에는 Tink를 바로 사용하는 것이 좋습니다.

앞서 언급한 Android 권장사항이 사용 사례에 맞지 않으며 키, 초기화 벡터, 솔트를 명시적으로 관리해야 하는 경우에는 다음 표준을 따르는 것이 좋습니다.

  1. 보안 키: 대칭형 보안 키는 예측할 수 없어야 하며 공개하지 않아야 합니다. 로컬 데이터를 암호화하려면 개발자는 암호학적으로 안전한 임의성(또는 PBEKeySpecs를 사용할 경우 사용자 생성 데이터)을 사용하여 보안 키를 구성하고 AndroidKeystore로 보안 키를 저장해야 합니다. 
  2. 초기화 벡터: 초기화 벡터는 여러 메시지에 걸쳐 고유하고 예측할 수 없어야 하지만 비공개로 유지할 필요는 없습니다. 개발자는 암호학적으로 안전한 임의성을 사용해 초기화 벡터를 구성해야 합니다. 개발자는 초기화 벡터를 연결된 암호문과 함께 저장하거나 전송해야 합니다.
  3. 솔트: 솔트는 여러 해시에 걸쳐 고유하고 예측할 수 없어야 하지만 비공개로 유지할 필요는 없습니다. 개발자는 암호학적으로 안전한 임의성을 사용해 솔트를 구성해야 합니다. 개발자는 솔트를 연결된 해시와 함께 저장하거나 전송해야 합니다.

다음 단계

  1. 위에 안내된 단계를 따라 앱을 업데이트합니다.
  2. Play Console에 로그인하여 업데이트된 앱 버전을 제출합니다.
이렇게 하면 앱은 검토 과정을 다시 거치게 되며, 앱이 적절히 업데이트되지 않은 경우 경고가 계속해서 표시됩니다. 이 절차는 몇 시간 정도 걸릴 수 있습니다.

도움이 필요한 경우

취약점에 관한 기술적인 문의사항이 있다면 'android-security' 태그를 사용하여 Stack Overflow에 질문을 올려 주시기 바랍니다.
 

도움이 되었나요?

어떻게 하면 개선할 수 있을까요?
false
기본 메뉴
9100187135816228230
true
도움말 센터 검색
true
true
true
true
true
5016068
false
false