EASY7

FIDO 지문인식 어플 예제 본문

개발 공부/Android Studio

FIDO 지문인식 어플 예제

E.asiest 2019. 9. 12. 20:41

생체 인증 FIDO 란?

Fast IDentity Online 의 약자로, "파이도"라 읽는다.

비밀번호의 문제점을 해결하기 위한 목적으로 Fido Alliance가 제안한 인증 프레임워크이다.

인증기법과 그 인증 정보를 주고 받기 위한 인증 프로토콜을 분리하는 것이 핵심 아이디어이다.

프로토콜은 아래와 같이 두가지가 있다.

① UAF(Universal Authentication Framework) 프로토콜 : 비밀번호 없이 인증하기

② U2F(Universal 2nd Factor) 프로토콜 : 비밀번호를 보완해서 인증하기

 

 

FIDO alliance ?

FIDO 기술 표준을 정하기 위해 2012년 7월에 설립된 협의회이다.

회원사로 삼성전자, 블랙베리, 크루셜텍, 구글, 레노보, 마스터카드, 마이크로소프트, 페이팔, LG전자, BC카드 등 전세계 250여개 회사가 있다. 이곳에서 표준화하는 인증기술은 생체인증 기술 등을 포함한다. 대한민국, 유럽, 인도, 일본, 중국에 워킹 그룹을 운영하고 있다.

2014년 12월 9일에 국제 인증기술 표준인 FIDO 1.0을 공개했다.

(신문 기사 : http://www.ciokorea.com/news/23328)

지문인식 어플 만들기

(참고 : https://altongmon.tistory.com/496)

실습 환경 : Android 8.0 (Oreo) + API 27, 28, 29

 

프로젝트 파일 :

android project.zip
0.82MB

1. AndroidManifest.xml에서 지문인식 퍼미션 등록.

<manifest>안에 포함시키기

1
 <uses-permission android:name="android.permission.USE_FINGERPRINT"/>
cs

2. 관련 액티비티 생성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
 
import android.annotation.TargetApi;
import android.databinding.DataBindingUtil;
import android.hardware.fingerprint.FingerprintManager;
import android.security.keystore.KeyGenParameterSpec;
import android.security.keystore.KeyPermanentlyInvalidatedException;
import android.security.keystore.KeyProperties;
import android.support.annotation.Nullable;
 
 
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.security.UnrecoverableKeyException;
 
 
 
import static android.content.Context.FINGERPRINT_SERVICE;
 
/*
 * Created by 15U560 on 2017-12-06.
 */
@TargetApi(Build.VERSION_CODES.M)
public class FingerPrintActivity extends AppCompatActivity {
 
    private static final String TAG = FingerPrintActivity.class.getSimpleName();
    private FingerprintManager manager;
    private KeyStore keyStore;
    private KeyGenerator keyGenerator;
    private static final String KEY_NAME = "example_key";
    private Cipher cipher;
    private FingerprintManager.CryptoObject cryptoObject;
    ActivityFingerprintBinding binding;
 
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        binding = DataBindingUtil.setContentView(this, R.layout.activity_fingerprint);
        manager = (FingerprintManager)getSystemService(FINGERPRINT_SERVICE);
        //KeyguardManager keyguardManager = (KeyguardManager) getSystemService(KEYGUARD_SERVICE);
        generateKey();
 
        if (cipherInit()) {
            cryptoObject =
                    new FingerprintManager.CryptoObject(cipher);
          //  FingerPrintHandler helper = new FingerPrintHandler(this, this, binding.fingerPrintImgView);
            FingerPrintHandler helper = new FingerPrintHandler(this);
            helper.startAuth(manager, cryptoObject);
        }
    }
    @TargetApi(Build.VERSION_CODES.M)
    protected void generateKey() {
        try {
            keyStore = KeyStore.getInstance("AndroidKeyStore");
        } catch (Exception e) {
            e.printStackTrace();
        }
 
        try {
            keyGenerator = KeyGenerator.getInstance(
                    KeyProperties.KEY_ALGORITHM_AES,
                    "AndroidKeyStore");
        } catch (NoSuchAlgorithmException |
                NoSuchProviderException e) {
            throw new RuntimeException(
                    "Failed to get KeyGenerator instance", e);
        }
 
        try {
            keyStore.load(null);
            keyGenerator.init(new
                    KeyGenParameterSpec.Builder(KEY_NAME,
                    KeyProperties.PURPOSE_ENCRYPT |
                            KeyProperties.PURPOSE_DECRYPT)
                    .setBlockModes(KeyProperties.BLOCK_MODE_CBC)
                    .setUserAuthenticationRequired(true)
                    .setEncryptionPaddings(
                            KeyProperties.ENCRYPTION_PADDING_PKCS7)
                    .build());
            keyGenerator.generateKey();
        } catch (NoSuchAlgorithmException |
                InvalidAlgorithmParameterException
                | CertificateException | IOException e) {
            throw new RuntimeException(e);
        }
    }
 
    @TargetApi(Build.VERSION_CODES.M)
    public boolean cipherInit() {
        try {
            cipher = Cipher.getInstance(
                    KeyProperties.KEY_ALGORITHM_AES + "/"
                            + KeyProperties.BLOCK_MODE_CBC + "/"
                            + KeyProperties.ENCRYPTION_PADDING_PKCS7);
        } catch (NoSuchAlgorithmException |
                NoSuchPaddingException e) {
            throw new RuntimeException("Failed to get Cipher", e);
        }
 
        try {
            keyStore.load(null);
            SecretKey key = (SecretKey) keyStore.getKey(KEY_NAME,
                    null);
            return true;
        } catch (KeyPermanentlyInvalidatedException e) {
            return false;
        } catch (KeyStoreException | CertificateException
                | UnrecoverableKeyException | IOException
                | NoSuchAlgorithmException | InvalidKeyException e) {
            throw new RuntimeException("Failed to init Cipher", e);
        }
    }
}
 
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
 

 

 

3. 관련 핸들러 생성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
 
import android.annotation.TargetApi;
import android.content.Context;
import android.hardware.fingerprint.FingerprintManager;
 
/*
 * Created by 15U560 on 2017-12-06.
 */
 
@TargetApi(Build.VERSION_CODES.M)
public class FingerPrintHandler extends FingerprintManager.AuthenticationCallback {
 
    private Context appContext;
 
    public FingerPrintHandler(Context context) {
        this.appContext = context;
 
    }
 
    public void startAuth(FingerprintManager manager, FingerprintManager.CryptoObject cryptoObject) {
        CancellationSignal cancellationSignal = new CancellationSignal();
        manager.authenticate(cryptoObject, cancellationSignal, 0thisnull);
    }
 
    @Override
    public void onAuthenticationError(int errMsgId,
                                      CharSequence errString) {
        Toast.makeText(appContext,
                "Authentication error\n" + errString,
                Toast.LENGTH_LONG).show();
    }
 
    @Override
    public void onAuthenticationHelp(int helpMsgId,
                                     CharSequence helpString) {
        Toast.makeText(appContext,
                "Authentication help\n" + helpString,
                Toast.LENGTH_LONG).show();
    }
 
    @Override
    public void onAuthenticationFailed() {
        Toast.makeText(appContext,
                "등록되지 않은 지문입니다." ,
                Toast.LENGTH_LONG).show();
 
    }
 
    @Override
    public void onAuthenticationSucceeded(
            FingerprintManager.AuthenticationResult result) {
 
        Intent intent = new Intent(appContext, SuccessActivity.class);
        appContext.startActivity(intent);
        Toast.makeText(appContext,"Authentication success\n" , Toast.LENGTH_LONG).show();
    //Toast.makeText(appContext, "Authentication success\n"+ errString, Toast.LENGTH_LONG).show();
    }
}
 
 
 
 
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
 

 

**activity 추가하는 법

새로 만들 액티비티의 레이아웃을 xml파일에 정의한다.

액티비티의 코드를 java파일에 작성한다.

새로 추가한 액티비티를 매니페스트에 등록한다.

startActivity 메서드로 액티비티를 호출한다.

 

 

MainActivity.java - activity_main.xml

FingerPrintActivity.java - activity_fingerprint.xml

SuccessActivity.java - activity_success.xml

 

 

 

 

 

 

 

 

 

'개발 공부 > Android Studio' 카테고리의 다른 글

액션바 숨기기  (0) 2017.08.05
안드로이드 스튜디오 핸드폰이랑 연결하기  (0) 2017.08.03
Comments