Android에서 인증 시스템을 보호하려면 비밀번호 기반 모델을 사용합니다. 은행 이메일 계정 등이 있죠 사용자가 설치하는 일부 앱에는 사용자에게 피싱을 시도할 수 있습니다.
또한 승인된 사용자만 기기를 사용할 것이라고 가정하지 마세요. 휴대전화 도용 흔한 문제로, 공격자가 언락된 기기를 표적으로 삼아 직접 수익을 창출합니다. 데이터를 수집할 수 있습니다. 모든 민감한 앱은 생체 인식 인증 및 생체 인식 인증을 통한 적절한 인증 제한 시간 (15분) 금전 등의 민감한 활동을 하기 전에 추가 인증을 요구합니다. 전송합니다.
생체 인식 인증 대화상자
생체 인식 라이브러리는 얼굴 인식, 지문 인식과 같은 생체 인식 인증. 그러나 생체 인식 프롬프트는 LSKF로 대체하도록 구성할 수 있으며, 알려진 숄더서핑 위험이 있는지 검사하지 않아도 됩니다. 민감한 앱의 경우 다음을 권장합니다. 생체 인식이 PIN으로 대체되지 않도록 하고, 생체 인식 재시도를 모두 사용한 후, 기다리거나, 비밀번호로 다시 로그인하거나, 계정을 재설정할 수 있습니다. 계정 재설정 기기에서 쉽게 액세스할 수 없는 요소를 요구해야 합니다 (권장사항 참조).
사기 및 휴대전화 도난을 완화하는 방법
사기 방지에 도움이 될 수 있는 특정 사용 사례로는 거래 전 앱 내 생체 인식 인증 사용자가 금융 거래를 하려는 경우 이를 위해 생체 인식 대화상자가 표시됩니다. 실제로 거래를 하는 사용자가 맞는지 확인합니다. 이 기기에 관계없이 공격자가 기기를 훔치는 것을 방어하는 것이 공격자가 LSKF를 알고 있는지 여부를 액세스할 수 있습니다.
보안 강화를 위해 앱 개발자는 클래스 3을 요청하는 것이 좋습니다.
생체 인식 인증, 뱅킹 및 결제에 CryptoObject
활용
금융 거래입니다.
구현
- androidx.biometric 라이브러리를 포함해야 합니다.
- 로직을 구성하세요.
Kotlin
private var executor: Executor? = null private var biometricPrompt: BiometricPrompt? = null private var promptInfo: BiometricPrompt.PromptInfo? = null fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_login) executor = ContextCompat.getMainExecutor(this) biometricPrompt = BiometricPrompt(this@MainActivity, executor, object : AuthenticationCallback() { fun onAuthenticationError( errorCode: Int, @NonNull errString: CharSequence ) { super.onAuthenticationError(errorCode, errString) Toast.makeText( getApplicationContext(), "Authentication error: $errString", Toast.LENGTH_SHORT ) .show() } fun onAuthenticationSucceeded( @NonNull result: BiometricPrompt.AuthenticationResult? ) { super.onAuthenticationSucceeded(result) Toast.makeText( getApplicationContext(), "Authentication succeeded!", Toast.LENGTH_SHORT ).show() } fun onAuthenticationFailed() { super.onAuthenticationFailed() Toast.makeText( getApplicationContext(), "Authentication failed", Toast.LENGTH_SHORT ) .show() } }) promptInfo = Builder() .setTitle("Biometric login for my app") .setSubtitle("Log in using your biometric credential") .setNegativeButtonText("Use account password") .build() // Prompt appears when user clicks "Log in". // Consider integrating with the keystore to unlock cryptographic operations, // if needed by your app. val biometricLoginButton: Button = findViewById(R.id.biometric_login) biometricLoginButton.setOnClickListener { view -> biometricPrompt.authenticate( promptInfo ) } }
Java
private Executor executor; private BiometricPrompt biometricPrompt; private BiometricPrompt.PromptInfo promptInfo; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_login); executor = ContextCompat.getMainExecutor(this); biometricPrompt = new BiometricPrompt(MainActivity.this, executor, new BiometricPrompt.AuthenticationCallback() { @Override public void onAuthenticationError(int errorCode, @NonNull CharSequence errString) { super.onAuthenticationError(errorCode, errString); Toast.makeText(getApplicationContext(), "Authentication error: " + errString, Toast.LENGTH_SHORT) .show(); } @Override public void onAuthenticationSucceeded( @NonNull BiometricPrompt.AuthenticationResult result) { super.onAuthenticationSucceeded(result); Toast.makeText(getApplicationContext(), "Authentication succeeded!", Toast.LENGTH_SHORT).show(); } @Override public void onAuthenticationFailed() { super.onAuthenticationFailed(); Toast.makeText(getApplicationContext(), "Authentication failed", Toast.LENGTH_SHORT) .show(); } }); promptInfo = new BiometricPrompt.PromptInfo.Builder() .setTitle("Biometric login for my app") .setSubtitle("Log in using your biometric credential") .setNegativeButtonText("Use account password") .build(); // Prompt appears when the user clicks "Log in". // Consider integrating with the keystore to unlock cryptographic operations, // if needed by your app. Button biometricLoginButton = findViewById(R.id.biometric_login); biometricLoginButton.setOnClickListener(view -> { biometricPrompt.authenticate(promptInfo); }); }
권장사항
생체 인식에 관해 자세히 알아보려면 Codelab부터 시작하는 것이 좋습니다.
사용 사례에 따라 대화상자를 구현할 수도 있고, 포함하지 않을 수도 있습니다. 명시적으로 사용자 작업을 수행할 수 있습니다 사기를 방지하려면 생체 인식 기능을 추가하는 것이 좋습니다. 모든 트랜잭션에 대한 명시적인 사용자 작업이 있는 대화상자 Google에서는 인증을 추가하면 UX에 문제가 발생할 수 있지만 은행 거래에서 처리되는 정보 및 생체 인식 인증이 다른 인증 방법보다 원활하고 이 수준의 탐색을 추가하는 데 필요합니다.
패스키
패스키는 비밀번호를 대체하는 더 안전하고 간편한 방법입니다. 패스키 사용 사용자가 앱과 웹사이트에 로그인할 수 있도록 지원하는 공개 키 암호화 지문이나 얼굴 인식 등 기기의 화면 잠금 메커니즘 사용 있습니다. 이렇게 하면 사용자가 비밀번호를 기억하고 관리할 필요가 없어 크게 개선된 보안을 제공합니다.
패스키는 단일 단계에서 다단계 인증 요구사항을 충족할 수 있습니다. 비밀번호와 OTP 코드를 모두 교체하여 SMS 또는 앱 기반의 일회성으로 인한 불편을 최소화 비밀번호 패스키가 표준화되므로 단일 구현으로 모든 사용자의 비밀번호 없는 환경을 기기, 브라우저, 실행할 수 있습니다
Android에서는 인증 관리자 Jetpack을 사용하여 패스키가 지원됩니다. 패스키, 비밀번호, 비밀번호, 비밀번호 등의 주요 인증 방법을 통합하는 비밀번호, 제휴 로그인 (예: Google 계정으로 로그인)에 적용됩니다.
사기를 줄이는 방법
패스키는 사용자의 기기에서만 작동하므로 피싱 공격으로부터 사용자를 보호합니다. 등록된 앱 및 웹사이트를 등록할 수 있습니다
패스키의 핵심 구성요소는 암호화 비공개 키입니다. 일반적으로 개인 키는 노트북이나 휴대폰과 같은 기기에만 있습니다. 인증 정보 공급자 (비밀번호라고도 함)에 의해 동기화되고 관리자)가 있습니다. 해당하는 공개 키만 패스키가 생성될 때 온라인 서비스에서 저장됩니다. 로그인하는 동안 서비스는 비공개 키를 사용하여 공개 키에서 본인 확인 요청에 서명합니다. 이 작업에서는 최대 사용자 기기 중 하나에서 비롯된 것입니다. 또한 이렇게 하려면 기기 또는 사용자 인증 정보 저장소를 잠금 해제하여 무단 로그인을 방지합니다. (예: 도난된 휴대전화에서)
기기가 도난되어 잠금 해제된 경우 무단 액세스를 방지하기 위해 패스키는 적절한 인증 제한 시간과 결합되어야 합니다. 공격자가 단순히 장치를 훔치는 대신 이전 사용자가 로그인했으므로 대신 사용자 인증 정보는 정기적으로 (예: 15분마다) 만료되며 사용자는 화면 잠금 재인증을 통해 본인 인증을 해야 합니다.
휴대전화를 도난당한 경우 패스키를 사용하면 휴대전화를 도용할 수 없으므로 패스키를 통해 사용자를 보호합니다. 다른 기기에서 사용하는 비밀번호 – 패스키는 기기별로 다릅니다. Google 비밀번호 관리자와 휴대전화를 도난당한 경우 Google 다른 기기 (예: 컴퓨터)에서 계정을 만들고 있습니다. 이렇게 하면 도난당한 휴대전화의 Google 비밀번호 관리자가 (저장된 패스키를 포함하여 사용 불가)
최악의 시나리오에서는 도난당한 기기가 복구되지 않으면 패스키가 만들고 동기화한 사용자 인증 정보 제공업체가 새 기기에 다시 동기화 패스키를 사용할 수 있습니다. 예를 들어 사용자가 Google 비밀번호 관리자를 선택하여 새 기기에서 패스키에 액세스할 수 있으며 Google 계정에 다시 로그인하고 이전 계정의 화면 잠금을 있습니다.
자세히 알아보기: Google 비밀번호 관리자의 패스키 보안 도움말
구현
패스키는 Android 9 (API 수준 28) 이상을 실행하는 기기에서 지원됩니다. 비밀번호 및 Google 계정으로 로그인은 Android 4.4부터 지원됩니다. 받는사람 패스키를 사용하려면 다음 단계를 따르세요.
- 인증 관리자 Codelab에 따라 패스키 구현 방법을 먼저 알아보세요.
- 패스키 사용자 환경 디자인 가이드라인을 검토합니다. 이 문서에서는 사용 사례에 권장되는 흐름을 보여줍니다.
- 가이드에 따라 인증 관리자를 살펴보세요.
- 앱의 인증 관리자 및 패스키 구현을 계획합니다. 디지털 애셋 링크에 대한 지원을 추가할 계획입니다.
개발자 문서를 생성, 등록, 제출하는 방법에 관한 자세한 내용은 패스키로 인증합니다.
보안 계정 재설정
잠금 해제된 기기에 액세스하는 권한 없는 공격자 (예: 휴대전화가 민감한 앱, 특히 은행 또는 현금 앱에 액세스하려고 시도할 것입니다. 앱이 생체 인식 인증을 구현하는 경우 공격자는 이를 재설정하려고 시도할 것입니다. 로그인할 수 없습니다. 계정 재설정 흐름은 보안 비밀에 전적으로 의존해서는 안 됩니다. 이메일이나 SMS OTP와 같이 기기에서 쉽게 액세스할 수 있는 정보 링크를 재설정하세요.
다음은 앱 재설정에 적용할 수 있는 일반적인 권장사항입니다. 흐름:
- 얼굴 인식(OTP 외)
- 보안 질문
- 지식 요소 (예: 어머니의 결혼 전 성, 출생 도시, 즐겨찾는 도시 등) 노래)
- 신분증 확인
SMS Retriever API
SMS Retriever API를 사용하면
Android 앱에서 자동으로 실행됩니다. 이렇게 하면 사용자는
인증 코드를 직접 입력합니다. 또한 이 API는 사용자에게
RECEIVE_SMS
또는
READ_SMS
SMS가
기기에 대한 무단 로컬 액세스로부터 보호합니다.
사기를 줄이는 방법
일부 사용자는 사기의 쉬운 진입점입니다
SMS Retriever API를 사용하면 앱에서 문자 메시지를 보내지 않고도 SMS 코드를 직접 검색할 수 있습니다. 수준 높은 사기 방지 기능을 제공할 수 있습니다.
구현
SMS Retriever API 구현은 Android와 서버, 두 부분으로 구성됩니다.
Android: (가이드)
- 사용자의 전화번호를 가져옵니다.
- SMS 검색 클라이언트를 시작합니다.
- 전화번호를 서버로 보냅니다.
- 인증 메일을 수신합니다.
- OTP를 서버로 보냅니다.
서버: (가이드)
- 확인 메시지를 작성합니다.
- SMS로 인증 메시지를 보냅니다.
- OTP가 반환되면 이를 확인합니다.
권장사항
앱이 통합되고 Google에서 사용자의 전화번호를 확인한 후 SMS Retriever API를 사용하면 OTP를 가져오려고 합니다. 성공한다면 신호를 보냅니다. 작동하지 않는 경우 사용자가 직접 OTP를 입력해야 한다면 경고 신호가 될 수 있습니다 사기를 겪고 있을 가능성이 있는 경우
SMS가 공간을 벗어나므로 사용자 확인 메커니즘으로만 사용해서는 안 됩니다. 잠금 해제된 장치를 훔치는 공격자와 같은 로컬 공격에 대한 위협 또는 SIM 복제 공격이 있습니다 가능하면 생체 인식을 사용하는 것이 좋습니다. 사용 설정됨 생체 인식 센서를 사용할 수 없는 기기의 경우 사용자 인증을 해야 합니다. 현재 기기에서 쉽게 얻을 수 없는 하나 이상의 요소에 의존합니다.
자세히 알아보기
권장사항에 대한 자세한 내용은 다음 리소스를 확인하세요.