{"id":282752,"date":"2016-12-20T11:15:04","date_gmt":"2016-12-20T08:15:04","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=282752"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=282752","title":{"rendered":"Android Fingerprint API: \u043f\u0440\u0438\u0434\u0435\u043b\u044b\u0432\u0430\u0435\u043c \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044e \u043f\u043e \u043e\u0442\u043f\u0435\u0447\u0430\u0442\u043a\u0443"},"content":{"rendered":"<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440!<br \/>  \u041f\u0440\u043e\u0448\u043b\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u043a\u0430\u043a \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f Fingerprint API \u0434\u043b\u044f Android, \u0432 \u0441\u0435\u0442\u0438 \u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u0440\u043e\u0437\u043d\u0435\u043d\u043d\u044b\u0445 \u0441\u044d\u043c\u043f\u043b\u043e\u0432 \u043a\u043e\u0434\u0430 \u043f\u043e \u0435\u0433\u043e \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u044e \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044e, \u043d\u043e \u043d\u0430 \u0425\u0430\u0431\u0440\u0435 \u043f\u043e \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043f\u0440\u0438\u0447\u0438\u043d\u0435 \u044d\u0442\u0443 \u0442\u0435\u043c\u0443 \u043e\u0431\u0445\u043e\u0434\u0438\u043b\u0438 \u0441\u0442\u043e\u0440\u043e\u043d\u043e\u0439. \u041d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434, \u043d\u0430\u0441\u0442\u0430\u043b\u043e \u0432\u0440\u0435\u043c\u044f \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u044d\u0442\u043e \u043d\u0435\u0434\u043e\u0440\u0430\u0437\u0443\u043c\u0435\u043d\u0438\u0435.<br \/>  \u0412\u0441\u0435\u0445 \u0437\u0430\u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043e\u0432\u0430\u0432\u0448\u0438\u0445\u0441\u044f \u043f\u0440\u043e\u0448\u0443 \u043f\u043e\u0434 \u043a\u0430\u0442.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/7a1\/40c\/d43\/7a140cd4306948bd99d0072315b53bd7.png\"\/><br \/>  <a name=\"habracut\"><\/a>  <\/p>\n<h3>\u041a\u0440\u0430\u0442\u0447\u0430\u0439\u0448\u0438\u0439 \u043b\u0438\u043a\u0431\u0435\u0437<\/h3>\n<p>  \u0418\u0442\u0430\u043a, \u0447\u0442\u043e \u0436\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 Fingerprint API?<br \/>  API \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043e\u043c \u0441\u0432\u043e\u0435\u0433\u043e \u043e\u0442\u043f\u0435\u0447\u0430\u0442\u043a\u0430, <a href=\"https:\/\/developer.android.com\/about\/versions\/marshmallow\/android-6.0.html#fingerprint-authentication\">\u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e<\/a>. <br \/>  \u0414\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0441\u0435\u043d\u0441\u043e\u0440\u043e\u043c API \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442 \u043d\u0430\u043c <i><a href=\"https:\/\/developer.android.com\/reference\/android\/hardware\/fingerprint\/FingerprintManager.html\">FingerprintManager<\/a><\/i>, \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0432 \u043e\u0441\u0432\u043e\u0435\u043d\u0438\u0438.<\/p>\n<p>  \u041a\u0430\u043a \u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c?<br \/>  \u0410 \u0432\u043e\u0442 \u044d\u0442\u043e \u0443\u0436\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0435\u0435. <br \/>  \u041f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u0435\u0437\u0434\u0435, \u0433\u0434\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u043e \u043f\u0430\u0440\u043e\u043b\u044e, \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u043a\u0440\u0443\u0442\u0438\u0442\u044c \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044e \u043f\u043e \u043e\u0442\u043f\u0435\u0447\u0430\u0442\u043a\u0443. <br \/>  \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u044c\u0442\u0435 \u0441\u0435\u0431\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u0441\u043e\u0441\u0442\u043e\u044f\u0449\u0435\u0435 \u0438\u0437 <i>LoginActivity<\/i> \u0438 <i>MainActivity<\/i>. \u041f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u043c\u044b \u043f\u043e\u043f\u0430\u0434\u0430\u0435\u043c \u043d\u0430 \u044d\u043a\u0440\u0430\u043d \u043b\u043e\u0433\u0438\u043d\u0430, \u0432\u0432\u043e\u0434\u0438\u043c \u043f\u0438\u043d-\u043a\u043e\u0434, \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u043c \u043a \u0434\u0430\u043d\u043d\u044b\u043c. \u041d\u043e \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u0445\u043e\u0434 \u043f\u043e \u043f\u0438\u043d-\u043a\u043e\u0434\u0443 \u043d\u0430 \u0432\u0445\u043e\u0434 \u043f\u043e \u043e\u0442\u043f\u0435\u0447\u0430\u0442\u043a\u0443. <br \/>  \u041a \u0441\u043b\u043e\u0432\u0443, \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043b\u0438\u0448\u044c \u0438\u0437\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043e\u0442 \u0440\u0443\u0447\u043d\u043e\u0433\u043e \u0432\u0432\u043e\u0434\u0430 \u043f\u0438\u043d-\u043a\u043e\u0434\u0430, \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044f \u0440\u0430\u043d\u0435\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u0439 \u043f\u0438\u043d-\u043a\u043e\u0434 (\u0438\u043c\u0435\u0435\u0442\u0441\u044f \u0432\u0432\u0438\u0434\u0443 \u043a\u043b\u0438\u0435\u043d\u0442-\u0441\u0435\u0440\u0432\u0435\u0440\u043d\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043d\u0443\u0436\u043d\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043f\u0430\u0440\u043e\u043b\u044c \u0441\u0435\u0440\u0432\u0435\u0440\u0443).<br \/>  \u041f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u043c.<\/p>\n<h3>\u0413\u0434\u0435 \u0441\u0435\u043d\u0441\u043e\u0440?<\/h3>\n<p>  \u0427\u0442\u043e\u0431\u044b \u043d\u0430\u0447\u0430\u0442\u044c \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u043f\u0440\u043e\u0444\u0438\u0442 \u043e\u0442 \u043d\u043e\u0432\u043e\u0433\u043e API, \u043f\u0435\u0440\u0432\u044b\u043c \u0434\u0435\u043b\u043e\u043c \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c <i>permission<\/i> \u0432 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u0435:  <\/p>\n<pre><code class=\"xml\">&lt;uses-permission android:name=&quot;android.permission.USE_FINGERPRINT&quot;\/&gt;<\/code><\/pre>\n<p>  \u0421\u0430\u043c\u043e \u0441\u043e\u0431\u043e\u0439, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Fingerprint API \u043c\u043e\u0436\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u0445, \u0435\u0433\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0449\u0438\u0445: \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u044d\u0442\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 Android 6+ \u0441 \u0441\u0435\u043d\u0441\u043e\u0440\u043e\u043c. <br \/>  \u0421\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u043c\u043e\u0436\u043d\u043e \u043b\u0435\u0433\u043a\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u0430:  <\/p>\n<pre><code class=\"java\">public static boolean checkFingerprintCompatibility(@NonNull Context context) {     return FingerprintManagerCompat.from(context).isHardwareDetected(); }<\/code><\/pre>\n<p>  <i><a href=\"https:\/\/developer.android.com\/reference\/android\/support\/v4\/hardware\/fingerprint\/FingerprintManagerCompat.html\">FingerprintManagerCompat<\/a><\/i> \u2014 \u044d\u0442\u043e \u0443\u0434\u043e\u0431\u043d\u0430\u044f \u043e\u0431\u0435\u0440\u0442\u043a\u0430 \u0434\u043b\u044f \u043e\u0431\u044b\u0447\u043d\u043e\u0433\u043e<i> FingerprintManager\u2019\u0430<\/i>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0443\u043f\u0440\u043e\u0449\u0430\u0435\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u043d\u0430 \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c, \u0438\u043d\u043a\u0430\u043f\u0441\u0443\u043b\u0438\u0440\u0443\u044f \u0432 \u0441\u0435\u0431\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u0432\u0435\u0440\u0441\u0438\u0438 API. \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, <i>isHardwareDetected()<\/i> \u0432\u0435\u0440\u043d\u0435\u0442 <i>false<\/i>, \u0435\u0441\u043b\u0438 API \u043d\u0438\u0436\u0435 23.<\/p>\n<p>  \u0414\u0430\u043b\u044c\u0448\u0435, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u043d\u044f\u0442\u044c, \u0433\u043e\u0442\u043e\u0432 \u043b\u0438 \u0441\u0435\u043d\u0441\u043e\u0440 \u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044e. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c <i>enum<\/i> \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439:  <\/p>\n<pre><code class=\"java\">public enum SensorState {     NOT_SUPPORTED,      NOT_BLOCKED, \/\/ \u0435\u0441\u043b\u0438 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u043d\u0435 \u0437\u0430\u0449\u0438\u0449\u0435\u043d\u043e \u043f\u0438\u043d\u043e\u043c, \u0440\u0438\u0441\u0443\u043d\u043a\u043e\u043c \u0438\u043b\u0438 \u043f\u0430\u0440\u043e\u043b\u0435\u043c     NO_FINGERPRINTS, \/\/ \u0435\u0441\u043b\u0438 \u043d\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0435 \u043d\u0435\u0442 \u043e\u0442\u043f\u0435\u0447\u0430\u0442\u043a\u043e\u0432     READY  }<\/code><\/pre>\n<p>  \u0418 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u043c\u0435\u0442\u043e\u0434\u043e\u043c:   <\/p>\n<pre><code class=\"java\">public static SensorState checkSensorState(@NonNull Context context) {     if (checkFingerprintCompatibility(context)) {         KeyguardManager keyguardManager =                  (KeyguardManager) context.getSystemService(KEYGUARD_SERVICE);         if (!keyguardManager.isKeyguardSecure()) {             return SensorState.NOT_BLOCKED;         }         FingerprintManagerCompat fingerprintManager = FingerprintManagerCompat.from(context);         if (!fingerprintManager.hasEnrolledFingerprints()) {             return SensorState.NO_FINGERPRINTS;         }         return SensorState.READY;     } else {         return SensorState.NOT_SUPPORTED;     } }<\/code><\/pre>\n<p>  \u041a\u043e\u0434 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u044b\u0439. \u041d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043d\u0435\u0434\u043e\u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u043c\u043e\u043c\u0435\u043d\u0442, \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u043e \u043b\u0438 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e. \u041d\u0430\u043c \u043d\u0443\u0436\u043d\u0430 \u044d\u0442\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u0442\u0430\u043a \u043a\u0430\u043a, \u0445\u043e\u0442\u044c Android \u0438 \u043d\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u043e\u0442\u043f\u0435\u0447\u0430\u0442\u043a\u0438 \u0432 \u043d\u0435\u0437\u0430\u0449\u0438\u0449\u0435\u043d\u043d\u043e\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e, \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u0438 \u044d\u0442\u043e \u043e\u0431\u0445\u043e\u0434\u044f\u0442, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u043e\u0434\u0441\u0442\u0440\u0430\u0445\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0435 \u043f\u043e\u043c\u0435\u0448\u0430\u0435\u0442.<br \/>  \u0420\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0434\u0430\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u043f\u043e\u043d\u044f\u0442\u044c, \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0438 \u043d\u0430\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0435\u0433\u043e \u043d\u0430 \u043f\u0443\u0442\u044c \u0438\u0441\u0442\u0438\u043d\u043d\u044b\u0439.<\/p>\n<h3>\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430<\/h3>\n<p>  \u0418\u0442\u0430\u043a, \u043d\u0435 \u0437\u0430\u0446\u0438\u043a\u043b\u0438\u0432\u0430\u044f\u0441\u044c \u043d\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0435 \u043f\u0438\u043d-\u043a\u043e\u0434\u0430 \u043d\u0430 \u0432\u0430\u043b\u0438\u0434\u043d\u043e\u0441\u0442\u044c, \u043f\u0440\u0438\u043a\u0438\u043d\u0435\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u043d\u0443\u044e \u043b\u043e\u0433\u0438\u043a\u0443 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439:  <\/p>\n<ul>\n<li>\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0432\u0432\u043e\u0434\u0438\u0442 \u043f\u0438\u043d-\u043a\u043e\u0434, \u0435\u0441\u043b\u0438 <i>SensorState.READY<\/i>, \u0442\u043e \u043c\u044b \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u043f\u0438\u043d-\u043a\u043e\u0434, \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c <i>MainActivity<\/i>.<\/li>\n<li>\u0420\u0435\u0441\u0442\u0430\u0440\u0442\u0438\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u0435\u0441\u043b\u0438 <i>SensorState.READY<\/i>, \u0442\u043e \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u043c \u043e\u0442\u043f\u0435\u0447\u0430\u0442\u043e\u043a, \u0434\u043e\u0441\u0442\u0430\u0435\u043c \u043f\u0438\u043d-\u043a\u043e\u0434, \u0438\u043c\u0438\u0442\u0438\u0440\u0443\u0435\u043c \u0435\u0433\u043e \u0432\u0432\u043e\u0434, \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c <i>MainActivity<\/i>.<\/li>\n<\/ul>\n<p>  \u0421\u0445\u0435\u043c\u0430 \u0431\u044b\u043b\u0430 \u0431\u044b \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0439, \u0435\u0441\u043b\u0438 \u0431\u044b \u043d\u0435 \u043e\u0434\u043d\u043e \u043d\u043e: \u0413\u0443\u0433\u043b \u043d\u0430\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442 \u043d\u0435 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u043c \u0432\u0438\u0434\u0435. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430\u043c \u043d\u0443\u0436\u0435\u043d \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0448\u0438\u0444\u0440\u043e\u0432\u043a\u0438 \u0438 \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u0438 \u0434\u043b\u044f, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f. \u0417\u0430\u0439\u043c\u0435\u043c\u0441\u044f \u044d\u0442\u0438\u043c.<\/p>\n<p>  \u0427\u0442\u043e \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0434\u043b\u044f \u0448\u0438\u0444\u0440\u043e\u0432\u043a\u0438 \u0438 \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u0438:  <\/p>\n<ol>\n<li>\u0417\u0430\u0449\u0438\u0449\u0435\u043d\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u0434\u043b\u044f \u043a\u043b\u044e\u0447\u0435\u0439.<\/li>\n<li>\u041a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043a\u043b\u044e\u0447.<\/li>\n<li>\u0428\u0438\u0444\u0440\u043e\u0432\u0430\u043b\u044c\u0449\u0438\u043a<\/li>\n<\/ol>\n<p>  <\/p>\n<h4>\u0425\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435<\/h4>\n<p>  \u0414\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043e\u0442\u043f\u0435\u0447\u0430\u0442\u043a\u0430\u043c\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043d\u0430\u043c \u0441\u0432\u043e\u0439 \u043a\u0435\u0439\u0441\u0442\u043e\u0440 \u2014 <i><a href=\"https:\/\/developer.android.com\/training\/articles\/keystore.html\">\u201cAndroidKeyStore\u201d<\/a><\/i> \u0438 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442 \u0437\u0430\u0449\u0438\u0442\u0443 \u043e\u0442 \u043d\u0435\u0441\u0430\u043d\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u0430. \u0412\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u0438\u043c:  <\/p>\n<pre><code class=\"java\">private static KeyStore sKeyStore; private static boolean getKeyStore() {     try {         sKeyStore = KeyStore.getInstance(&quot;AndroidKeyStore&quot;);         sKeyStore.load(null);         return true;     } catch (KeyStoreException | IOException | NoSuchAlgorithmException | CertificateException e) {         e.printStackTrace();     }     return false; }<\/code><\/pre>\n<p>  \u0421\u043b\u0435\u0434\u0443\u0435\u0442 \u043f\u0440\u0438\u043d\u044f\u0442\u044c, \u043f\u043e\u043d\u044f\u0442\u044c \u0438 \u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c, \u0447\u0442\u043e <b>\u043a\u0435\u0439\u0441\u0442\u043e\u0440 \u0445\u0440\u0430\u043d\u0438\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043a\u043b\u044e\u0447\u0438<\/b>. \u041f\u0430\u0440\u043e\u043b\u0438, \u043f\u0438\u043d \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0442\u0430\u043c \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043d\u0435\u043b\u044c\u0437\u044f.<\/p>\n<h4>\u041a\u043b\u044e\u0447<\/h4>\n<p>  \u041d\u0430 \u0432\u044b\u0431\u043e\u0440 \u0443 \u043d\u0430\u0441 \u0434\u0432\u0430 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430 \u043a\u043b\u044e\u0447\u0435\u0439: \u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u044b\u0439 \u043a\u043b\u044e\u0447 \u0438 \u043f\u0430\u0440\u0430 \u0438\u0437 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u043e\u0433\u043e \u0438 \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u043e\u0433\u043e \u043a\u043b\u044e\u0447\u0430. \u0418\u0437 \u0441\u043e\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 UX \u043c\u044b \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u043f\u0430\u0440\u043e\u0439. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u043d\u0430\u043c \u043e\u0442\u0434\u0435\u043b\u0438\u0442\u044c \u0432\u0432\u043e\u0434 \u043e\u0442\u043f\u0435\u0447\u0430\u0442\u043a\u0430 \u043e\u0442 \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0438\u043d-\u043a\u043e\u0434\u0430.<\/p>\n<p>  \u041a\u043b\u044e\u0447\u0438 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0434\u043e\u0441\u0442\u0430\u0432\u0430\u0442\u044c \u0438\u0437 \u043a\u0435\u0439\u0441\u0442\u043e\u0440\u0430, \u043d\u043e \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0443\u0436\u043d\u043e \u0438\u0445 \u0442\u0443\u0434\u0430 \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c. \u0414\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043a\u043b\u044e\u0447\u0430 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f <a href=\"https:\/\/developer.android.com\/reference\/java\/security\/KeyPairGenerator.html\">\u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u043c<\/a>.  <\/p>\n<pre><code class=\"java\">private static KeyPairGenerator sKeyPairGenerator; private static boolean getKeyPairGenerator() {     try {         sKeyPairGenerator = KeyPairGenerator.getInstance(KeyProperties.KEY_ALGORITHM_RSA, &quot;AndroidKeyStore&quot;);         return true;     } catch (NoSuchAlgorithmException | NoSuchProviderException e) {         e.printStackTrace();     }     return false; }<\/code><\/pre>\n<p>  \u041f\u0440\u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043c\u044b \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c, \u0432 \u043a\u0430\u043a\u043e\u0439 \u043a\u0435\u0439\u0441\u0442\u043e\u0440 \u043f\u043e\u0439\u0434\u0443\u0442 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043a\u043b\u044e\u0447\u0438 \u0438 \u0434\u043b\u044f \u043a\u0430\u043a\u043e\u0433\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d \u044d\u0442\u043e\u0442 \u043a\u043b\u044e\u0447.<br \/>  \u0421\u0430\u043c\u0430 \u0436\u0435 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:  <\/p>\n<pre><code class=\"java\">private static boolean generateNewKey() {     if (getKeyPairGenerator()) {         try {             sKeyPairGenerator.initialize(new KeyGenParameterSpec.Builder(KEY_ALIAS,                  KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT)                     .setDigests(KeyProperties.DIGEST_SHA256, KeyProperties.DIGEST_SHA512)                     .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_RSA_OAEP)                     .setUserAuthenticationRequired(true)                     .build());             sKeyPairGenerator.generateKeyPair();             return true;         } catch (InvalidAlgorithmParameterException e) {             e.printStackTrace();         }     }     return false; }<\/code><\/pre>\n<p>  \u0417\u0434\u0435\u0441\u044c \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u0434\u0432\u0430 \u043c\u0435\u0441\u0442\u0430:  <\/p>\n<ul>\n<li>KEY_ALIAS \u2014 \u044d\u0442\u043e \u043f\u0441\u0435\u0432\u0434\u043e\u043d\u0438\u043c \u043a\u043b\u044e\u0447\u0430, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0432\u044b\u0434\u0435\u0440\u0433\u0438\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u0438\u0437 \u043a\u0435\u0439\u0441\u0442\u043e\u0440\u0430, \u043e\u0431\u044b\u0447\u043d\u044b\u0439 psfs.<\/li>\n<li>.setUserAuthenticationRequired(true) \u2014 \u044d\u0442\u043e\u0442 \u0444\u043b\u0430\u0433 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442, \u0447\u0442\u043e \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437, \u043a\u043e\u0433\u0434\u0430 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043a\u043b\u044e\u0447\u043e\u043c, \u043d\u0443\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u044c \u0441\u0435\u0431\u044f, \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u2014 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u0442\u043f\u0435\u0447\u0430\u0442\u043a\u0430.<\/li>\n<\/ul>\n<p>  \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043a\u043b\u044e\u0447\u0430 \u0431\u0443\u0434\u0435\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:  <\/p>\n<pre><code class=\"java\">private static boolean isKeyReady() {     try {         return sKeyStore.containsAlias(KEY_ALIAS) || generateNewKey();     } catch (KeyStoreException e) {         e.printStackTrace();     }     return false; }<\/code><\/pre>\n<p>  <\/p>\n<h4>\u0428\u0438\u0444\u0440\u043e\u0432\u0430\u043b\u044c\u0449\u0438\u043a<\/h4>\n<p>  \u0428\u0438\u0444\u0440\u043e\u0432\u043a\u043e\u0439 \u0438 \u0434\u0435\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u043e\u0439 \u0432 Java \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u043e\u0431\u044a\u0435\u043a\u0442 <i><a href=\"https:\/\/developer.android.com\/reference\/javax\/crypto\/Cipher.html\">Cipher<\/a><\/i>. \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u0435\u0433\u043e:  <\/p>\n<pre><code class=\"java\">private static Cipher sCipher; private static boolean getCipher() {     try {         sCipher = Cipher.getInstance(&quot;RSA\/ECB\/OAEPWithSHA-256AndMGF1Padding&quot;);         return true;     } catch (NoSuchAlgorithmException | NoSuchPaddingException e) {         e.printStackTrace();     }     return false; }<\/code><\/pre>\n<p>  \u0410\u0434\u043e\u0432\u0430\u044f \u043c\u0435\u0448\u0430\u043d\u0438\u043d\u0430 \u0432 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0435 \u2014 \u044d\u0442\u043e \u0441\u0442\u0440\u043e\u043a\u0430 \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0432 \u0441\u0435\u0431\u044f <a href=\"https:\/\/ru.wikipedia.org\/wiki\/RSA\">\u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c<\/a>, <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%A0%D0%B5%D0%B6%D0%B8%D0%BC_%D1%88%D0%B8%D1%84%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F\">\u0440\u0435\u0436\u0438\u043c \u0441\u043c\u0435\u0448\u0438\u0432\u0430\u043d\u0438\u044f<\/a> \u0438 <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%94%D0%BE%D0%BF%D0%BE%D0%BB%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_(%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B3%D1%80%D0%B0%D1%84%D0%B8%D1%8F)\">\u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435<\/a>.<\/p>\n<p>  \u041f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 <i>Cipher<\/i>, \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u0442\u044c \u0435\u0433\u043e \u043a \u0440\u0430\u0431\u043e\u0442\u0435.<br \/>  \u041f\u0440\u0438 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043a\u043b\u044e\u0447\u0430 \u043c\u044b \u0443\u043a\u0430\u0437\u0430\u043b\u0438, \u0447\u0442\u043e \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0448\u0438\u0444\u0440\u043e\u0432\u043a\u0438 \u0438 \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u0438. \u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, <i>Cipher<\/i> \u0442\u043e\u0436\u0435 \u0431\u0443\u0434\u0435\u0442 \u0434\u043b\u044f \u044d\u0442\u0438\u0445 \u0446\u0435\u043b\u0435\u0439:  <\/p>\n<pre><code class=\"java\">private static boolean initCipher(int mode) {     try {         sKeyStore.load(null);         switch (mode) {             case Cipher.ENCRYPT_MODE:                 initEncodeCipher(mode);                 break;             case Cipher.DECRYPT_MODE:                 initDecodeCipher(mode);                 break;             default:                 return false; \/\/this cipher is only for encode\\decode             }         return true;     } catch (KeyPermanentlyInvalidatedException exception) {         deleteInvalidKey();     } catch (KeyStoreException | CertificateException | UnrecoverableKeyException | IOException |                 NoSuchAlgorithmException | InvalidKeyException | InvalidKeySpecException | InvalidAlgorithmParameterException e) {         e.printStackTrace();     }     return false; } <\/code><\/pre>\n<p>  \u0433\u0434\u0435<i> initDecodeCipher()<\/i> \u0438 <i>initEncodeCiper()<\/i> \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435:  <\/p>\n<pre><code class=\"java\">private static void initDecodeCipher(int mode) throws KeyStoreException, NoSuchAlgorithmException, UnrecoverableKeyException, InvalidKeyException {     PrivateKey key = (PrivateKey) sKeyStore.getKey(KEY_ALIAS, null);     sCipher.init(mode, key); }<\/code><\/pre>\n<p>   <\/p>\n<pre><code class=\"java\">private static void initEncodeCipher(int mode) throws KeyStoreException, InvalidKeySpecException, NoSuchAlgorithmException, InvalidKeyException, InvalidAlgorithmParameterException {     PublicKey key = sKeyStore.getCertificate(KEY_ALIAS).getPublicKey();     PublicKey unrestricted = KeyFactory.getInstance(key.getAlgorithm()).generatePublic(new X509EncodedKeySpec(key.getEncoded()));     OAEPParameterSpec spec = new OAEPParameterSpec(&quot;SHA-256&quot;, &quot;MGF1&quot;, MGF1ParameterSpec.SHA1, PSource.PSpecified.DEFAULT);     sCipher.init(mode, unrestricted, spec); }<\/code><\/pre>\n<p>  \u041d\u0435\u0442\u0440\u0443\u0434\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u0437\u0430\u0448\u0438\u0444\u0440\u043e\u0432\u044b\u0432\u0430\u044e\u0449\u0438\u0439 <i>Cipher<\/i> \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u043b\u043e\u0436\u043d\u0435\u0435 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c. \u042d\u0442\u043e \u043a\u043e\u0441\u044f\u043a \u0441\u0430\u043c\u043e\u0433\u043e \u0413\u0443\u0433\u043b\u0430, \u0441\u0443\u0442\u044c \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0439 \u043a\u043b\u044e\u0447 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. \u041c\u044b \u043e\u0431\u0445\u043e\u0434\u0438\u043c \u044d\u0442\u043e \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u043b\u0435\u043f\u043a\u0430 \u043a\u043b\u044e\u0447\u0430 (<a href=\"http:\/\/stackoverflow.com\/a\/36021145\/5884194\">\u043a\u043e\u0441\u0442\u044b\u043b\u044c<\/a>, \u0430\u0433\u0430).<\/p>\n<p>  \u041c\u043e\u043c\u0435\u043d\u0442 \u0441 <i>KeyPermanentlyInvalidatedException<\/i> \u2014 \u0435\u0441\u043b\u0438 \u043f\u043e \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043f\u0440\u0438\u0447\u0438\u043d\u0435 \u043a\u043b\u044e\u0447 \u043d\u0435\u043b\u044c\u0437\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c, \u0432\u044b\u0441\u0442\u0440\u0435\u043b\u0438\u0432\u0430\u0435\u0442 \u044d\u0442\u043e \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u043f\u0440\u0438\u0447\u0438\u043d\u044b \u2014 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u043e\u0442\u043f\u0435\u0447\u0430\u0442\u043a\u0430 \u043a \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u043c\u0443, \u0441\u043c\u0435\u043d\u0430 \u0438\u043b\u0438 \u043f\u043e\u043b\u043d\u043e\u0435 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438. \u0422\u043e\u0433\u0434\u0430 \u043a\u043b\u044e\u0447 \u0431\u043e\u043b\u0435\u0435 \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u0441\u043c\u044b\u0441\u043b\u0430 \u0445\u0440\u0430\u043d\u0438\u0442\u044c, \u0438 \u043c\u044b \u0435\u0433\u043e \u0443\u0434\u0430\u043b\u044f\u0435\u043c.   <\/p>\n<pre><code class=\"java\">public static void deleteInvalidKey() {     if (getKeyStore()) {         try {             sKeyStore.deleteEntry(KEY_ALIAS);         } catch (KeyStoreException e) {             e.printStackTrace();         }     } }<\/code><\/pre>\n<p>  \u041c\u0435\u0442\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442 \u0432\u0441\u044e \u0446\u0435\u043f\u043e\u0447\u043a\u0443 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0438:  <\/p>\n<pre><code class=\"java\">private static boolean prepare() {     return getKeyStore() && getCipher() && isKeyReady(); }<\/code><\/pre>\n<p>  <\/p>\n<h3>\u0428\u0438\u0444\u0440\u043e\u0432\u043a\u0430 \u0438 \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u0430<\/h3>\n<p>  \u041e\u043f\u0438\u0448\u0435\u043c \u043c\u0435\u0442\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0430\u0448\u0438\u0444\u0440\u043e\u0432\u044b\u0432\u0430\u0435\u0442 \u0441\u0442\u0440\u043e\u043a\u0443 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442:   <\/p>\n<pre><code class=\"java\">public static String encode(String inputString) {     try {         if (prepare() && initCipher(Cipher.ENCRYPT_MODE)) {             byte[] bytes = sCipher.doFinal(inputString.getBytes());             return Base64.encodeToString(bytes, Base64.NO_WRAP);         }     } catch (IllegalBlockSizeException | BadPaddingException exception) {         exception.printStackTrace();     }     return null; }<\/code><\/pre>\n<p>  \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c <i>Base64<\/i>-\u0441\u0442\u0440\u043e\u043a\u0443, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u043e\u0436\u043d\u043e \u0441\u043f\u043e\u043a\u043e\u0439\u043d\u043e \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432 \u043f\u0440\u0435\u0444\u0435\u0440\u0435\u043d\u0441\u0430\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<\/p>\n<p>  \u0414\u043b\u044f \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u0438 \u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043c\u0435\u0442\u043e\u0434:   <\/p>\n<pre><code class=\"java\">public static String decode(String encodedString, Cipher cipherDecrypter) {     try {         byte[] bytes = Base64.decode(encodedString, Base64.NO_WRAP);         return new String(cipherDecrypter.doFinal(bytes));     } catch (IllegalBlockSizeException | BadPaddingException exception) {         exception.printStackTrace();     }     return null; }<\/code><\/pre>\n<p>  \u041e\u043f\u0430, \u043d\u0430 \u0432\u0445\u043e\u0434 \u043e\u043d \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443, \u043d\u043e \u0438 \u043e\u0431\u044a\u0435\u043a\u0442 <i>Cipher<\/i>.<br \/>  \u041e\u0442\u043a\u0443\u0434\u0430 \u043e\u043d \u0442\u0430\u043c \u0432\u0437\u044f\u043b\u0441\u044f, \u0441\u0442\u0430\u043d\u0435\u0442 \u044f\u0441\u043d\u043e \u043f\u043e\u0437\u0434\u043d\u0435\u0435.<\/p>\n<h3>\u041d\u0435 \u0442\u043e\u0442 \u043f\u0430\u043b\u0435\u0446<\/h3>\n<p>  \u0414\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u043a\u043e\u043d\u0435\u0446 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0435\u043d\u0441\u043e\u0440, \u043d\u0443\u0436\u043d\u043e \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043c\u0435\u0442\u043e\u0434\u043e\u043c <i>FingerprintManagerCompat<\/i>:  <\/p>\n<pre><code class=\"java\">void authenticate (FingerprintManagerCompat.CryptoObject crypto,                  CancellationSignal cancel,                  int flags,                  FingerprintManagerCompat.AuthenticationCallback callback,                  Handler handler)<\/code><\/pre>\n<p>  \u0425\u0435\u043d\u0434\u043b\u0435\u0440 \u0438 \u0444\u043b\u0430\u0433\u0438 \u043d\u0430\u043c \u0441\u0435\u0439\u0447\u0430\u0441 \u043d\u0435 \u043d\u0443\u0436\u043d\u044b, \u0441\u0438\u0433\u043d\u0430\u043b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f, \u0447\u0442\u043e\u0431\u044b \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0440\u0435\u0436\u0438\u043c \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u043e\u0442\u043f\u0435\u0447\u0430\u0442\u043a\u043e\u0432 (\u043f\u0440\u0438 \u0441\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440), \u043a\u043e\u043b\u043b\u0431\u0435\u043a\u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u043d\u0438\u044f, \u0430 \u0432\u043e\u0442 \u043d\u0430\u0434 \u043a\u0440\u0438\u043f\u0442\u043e\u043e\u0431\u044a\u0435\u043a\u0442\u043e\u043c \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c\u0441\u044f \u043f\u043e\u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435.<br \/>  <i><a href=\"https:\/\/developer.android.com\/reference\/android\/support\/v4\/hardware\/fingerprint\/FingerprintManagerCompat.CryptoObject.html\">CryptoObject<\/a><\/i> \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u043e\u0431\u0435\u0440\u0442\u043a\u0430 \u0434\u043b\u044f <i>Cipher&#8217;a<\/i>. \u0427\u0442\u043e\u0431\u044b \u0435\u0433\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043c\u0435\u0442\u043e\u0434:   <\/p>\n<pre><code class=\"java\">public static FingerprintManagerCompat.CryptoObject getCryptoObject() {     if (prepare() && initCipher(Cipher.DECRYPT_MODE)) {         return new FingerprintManagerCompat.CryptoObject(sCipher);     }     return null; }<\/code><\/pre>\n<p>  \u041a\u0430\u043a \u0432\u0438\u0434\u043d\u043e \u0438\u0437 \u043a\u043e\u0434\u0430, \u043a\u0440\u0438\u043f\u0442\u043e\u043e\u0431\u044a\u0435\u043a\u0442 \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u0438\u0437 <b>\u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u044b\u0432\u0430\u044e\u0449\u0435\u0433\u043e<\/b> <i>Cipher<\/i>.<br \/>  \u0415\u0441\u043b\u0438 \u044d\u0442\u043e\u0442 <i>Cipher<\/i> \u043f\u0440\u044f\u043c\u043e \u0441\u0435\u0439\u0447\u0430\u0441 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0432 \u043c\u0435\u0442\u043e\u0434 <i>decode()<\/i>, \u0442\u043e \u0432\u044b\u043b\u0435\u0442\u0438\u0442 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435, \u043e\u043f\u043e\u0432\u0435\u0449\u0430\u044e\u0449\u0435\u0435 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u043c\u044b \u043f\u044b\u0442\u0430\u0435\u043c\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u043b\u044e\u0447 \u0431\u0435\u0437 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f.<br \/>  \u0421\u0442\u0440\u043e\u0433\u043e \u0433\u043e\u0432\u043e\u0440\u044f, \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043a\u0440\u0438\u043f\u0442\u043e\u043e\u0431\u044a\u0435\u043a\u0442 \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0435\u0433\u043e \u043d\u0430 \u0432\u0445\u043e\u0434 \u0432 <i>authenticate()<\/i> \u043a\u0430\u043a \u0440\u0430\u0437 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u044d\u0442\u043e\u0433\u043e \u0441\u0430\u043c\u043e\u0433\u043e \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f.<br \/>  \u0415\u0441\u043b\u0438 <i>getCryptoObject()<\/i> \u0432\u0435\u0440\u043d\u0443\u043b <i>null<\/i>, \u0442\u043e \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u043f\u0440\u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 <i>Chiper<\/i>&#8216;\u0430 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u0435\u043b <i>KeyPermanentlyInvalidatedException<\/i>. \u0422\u0443\u0442 \u0443\u0436\u0435 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043f\u043e\u0434\u0435\u043b\u0430\u0435\u0448\u044c, \u043a\u0440\u043e\u043c\u0435 \u043a\u0430\u043a \u0434\u0430\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u0437\u043d\u0430\u0442\u044c, \u0447\u0442\u043e \u0432\u0445\u043e\u0434 \u043f\u043e \u043e\u0442\u043f\u0435\u0447\u0430\u0442\u043a\u0443 \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u0438 \u0435\u043c\u0443 \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u0437\u0430\u043d\u043e\u0432\u043e \u0432\u0432\u0435\u0441\u0442\u0438 \u043f\u0438\u043d-\u043a\u043e\u0434. <\/p>\n<p>  \u041a\u0430\u043a \u044f \u0443\u0436\u0435 \u0433\u043e\u0432\u043e\u0440\u0438\u043b, \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u0441\u0435\u043d\u0441\u043e\u0440\u0430 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0432 \u043c\u0435\u0442\u043e\u0434\u0430\u0445 <a href=\"https:\/\/developer.android.com\/reference\/android\/support\/v4\/hardware\/fingerprint\/FingerprintManagerCompat.AuthenticationCallback.html\">\u043a\u043e\u043b\u043b\u0431\u0435\u043a\u0430<\/a>. \u0412\u043e\u0442 \u043a\u0430\u043a \u043e\u043d\u0438 \u0432\u044b\u0433\u043b\u044f\u0434\u044f\u0442:   <\/p>\n<pre><code class=\"java\">@Override public void onAuthenticationHelp(int helpCode, CharSequence helpString) {     \/\/\u0433\u0440\u044f\u0437\u043d\u044b\u0435 \u043f\u0430\u043b\u044c\u0447\u0438\u043a\u0438, \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0441\u0438\u043b\u044c\u043d\u044b\u0439 \u0437\u0430\u0436\u0438\u043c     \/\/\u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c helpString \u0432 \u0432\u0438\u0434\u0435 \u0442\u043e\u0441\u0442\u0430 }  @Override public void onAuthenticationFailed() {     \/\/\u043e\u0442\u043f\u0435\u0447\u0430\u0442\u043e\u043a \u0441\u0447\u0438\u0442\u0430\u043b\u0441\u044f, \u043d\u043e \u043d\u0435 \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u043b\u0441\u044f }  @Override public void onAuthenticationError(int errorCode, CharSequence errString) {     \/\/\u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043d\u0435\u0443\u0434\u0430\u0447\u043d\u044b\u0445 \u043f\u043e\u043f\u044b\u0442\u043e\u043a \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u043d\u0438\u044f (5)     \/\/\u043f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0441\u0435\u043d\u0441\u043e\u0440 \u0441\u0442\u0430\u043d\u0435\u0442 \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u043c \u043d\u0430 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432\u0440\u0435\u043c\u044f (30 \u0441\u0435\u043a) }  @Override public void onAuthenticationSucceeded(@NonNull FingerprintManagerCompat.AuthenticationResult result) {     \/\/\u0432\u0441\u0435 \u043f\u0440\u043e\u0448\u043b\u043e \u0443\u0441\u043f\u0435\u0448\u043d\u043e }<\/code><\/pre>\n<p>  \u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0433\u043e \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u043d\u0438\u044f \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c <i>AuthenticationResult<\/i>, \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043c\u043e\u0436\u0435\u043c \u0434\u043e\u0441\u0442\u0430\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442 <i>Cipher<\/i> c \u0443\u0436\u0435 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u043d\u044b\u043c \u043a\u043b\u044e\u0447\u043e\u043c:  <\/p>\n<pre><code class=\"java\">result.getCryptoObject().getCipher()<\/code><\/pre>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u0441 \u0447\u0438\u0441\u0442\u043e\u0439 \u0441\u043e\u0432\u0435\u0441\u0442\u044c\u044e \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0435\u0433\u043e \u043d\u0430 \u0432\u0445\u043e\u0434 \u0432 <i>decode()<\/i>, \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043f\u0438\u043d-\u043a\u043e\u0434, \u0441\u044b\u043c\u0438\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u0432\u0432\u043e\u0434 \u0438 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u0435\u0433\u043e \u0434\u0430\u043d\u043d\u044b\u0435.<\/p>\n<p>  \u041d\u0430 \u044d\u0442\u043e\u043c \u043d\u0430 \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u0432\u0441\u0451, \u0437\u0430\u043c\u0435\u0447\u0430\u043d\u0438\u044f, \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438, \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438 \u0432\u043e\u043f\u0440\u043e\u0441\u044b \u043f\u0440\u0438\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442\u0441\u044f. <br \/>  \u041f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0438\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0440\u0430\u0431\u043e\u0442\u044b \u043a\u043e\u0434\u0430 \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 <a href=\"https:\/\/github.com\/AzretMagometov\/FingerprintSample\">\u0433\u0438\u0442\u0445\u0430\u0431\u0435<\/a>.<\/p>\n<p>  \u0421\u043f\u0430\u0441\u0438\u0431\u043e \u0437\u0430 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435.<br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habrahabr.ru\/post\/317706\/\"> https:\/\/habrahabr.ru\/post\/317706\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440!<br \/>  \u041f\u0440\u043e\u0448\u043b\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u043a\u0430\u043a \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f Fingerprint API \u0434\u043b\u044f Android, \u0432 \u0441\u0435\u0442\u0438 \u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u0440\u043e\u0437\u043d\u0435\u043d\u043d\u044b\u0445 \u0441\u044d\u043c\u043f\u043b\u043e\u0432 \u043a\u043e\u0434\u0430 \u043f\u043e \u0435\u0433\u043e \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u044e \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044e, \u043d\u043e \u043d\u0430 \u0425\u0430\u0431\u0440\u0435 \u043f\u043e \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043f\u0440\u0438\u0447\u0438\u043d\u0435 \u044d\u0442\u0443 \u0442\u0435\u043c\u0443 \u043e\u0431\u0445\u043e\u0434\u0438\u043b\u0438 \u0441\u0442\u043e\u0440\u043e\u043d\u043e\u0439. \u041d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434, \u043d\u0430\u0441\u0442\u0430\u043b\u043e \u0432\u0440\u0435\u043c\u044f \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u044d\u0442\u043e \u043d\u0435\u0434\u043e\u0440\u0430\u0437\u0443\u043c\u0435\u043d\u0438\u0435.<br \/>  \u0412\u0441\u0435\u0445 \u0437\u0430\u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043e\u0432\u0430\u0432\u0448\u0438\u0445\u0441\u044f \u043f\u0440\u043e\u0448\u0443 \u043f\u043e\u0434 \u043a\u0430\u0442.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/7a1\/40c\/d43\/7a140cd4306948bd99d0072315b53bd7.png\"\/>  <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-282752","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/282752","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=282752"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/282752\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=282752"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=282752"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=282752"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}