다음을 통해 공유


KeyProtection 클래스

정의

Android Keystore 시스템으로 가져올 때 키 또는 키 쌍을 보호하는 방법의 사양입니다.

[Android.Runtime.Register("android/security/keystore/KeyProtection", ApiSince=23, DoNotGenerateAcw=true)]
public sealed class KeyProtection : Java.Lang.Object, IDisposable, Java.Interop.IJavaPeerable, Java.Security.KeyStore.IProtectionParameter
[<Android.Runtime.Register("android/security/keystore/KeyProtection", ApiSince=23, DoNotGenerateAcw=true)>]
type KeyProtection = class
    inherit Object
    interface KeyStore.IProtectionParameter
    interface IJavaObject
    interface IDisposable
    interface IJavaPeerable
상속
KeyProtection
특성
구현

설명

Android Keystore 시스템으로 가져올 때 키 또는 키 쌍을 보호하는 방법의 사양입니다. 이 클래스는 키를 사용하기 위해 사용자 인증이 필요한지 여부, 키가 어떤 매개 변수(예: 특정 패딩 체계 또는 다이제스트만 사용)와 함께 권한이 부여된 작업(예: 암호 해독이지만 서명하지 않음) 및 키의 유효 시작 및 종료 날짜와 같은 가져온 키의 권한 있는 사용을 지정합니다. 이 클래스에 표현된 키 사용 권한 부여는 비밀 키 및 프라이빗 키에만 적용됩니다. 퍼블릭 키는 지원되는 모든 작업에 사용할 수 있습니다.

키 또는 키 쌍을 Android Keystore로 가져오려면 해당 클래스를 사용하여 Builder 이 클래스의 인스턴스를 만들고 가져오려는 키 또는 키 쌍으로 인스턴스를 java.security.KeyStore#setEntry(String, java.security.KeyStore.Entry, ProtectionParameter) KeyStore.setEntry 전달합니다.

Android Keystore에서 비밀/대칭 또는 프라이빗 키를 가져오려면 또는 java.security.KeyStore#getKey(String, char[]) KeyStore.getKey(String, null) java.security.KeyStore#getEntry(String, java.security.KeyStore.ProtectionParameter) KeyStore.getEntry(String, null). Android Keystore에서 공개 키를 가져오려면 다음Certificate#getPublicKey()을 사용합니다java.security.KeyStore#getCertificate(String).

Android Keystore에 저장된 키 쌍의 알고리즘별 공용 매개 변수를 얻기 위해 프라이빗 키는 구현하거나 java.security.interfaces.RSAKey 인터페이스를 구현 java.security.interfaces.ECKey 하는 반면 퍼블릭 키는 인터페이스를 구현 java.security.interfaces.RSAPublicKey java.security.interfaces.ECPublicKey 합니다.

참고: Android 키 저장소에 저장된 키의 키 자료에 액세스할 수 없습니다.

이 클래스의 인스턴스는 변경할 수 없습니다.

<h3>알려진 문제</h3> Android 6.0(API 수준 23)의 알려진 버그로 인해 공개 키에 대해서도 사용자 인증 관련 권한 부여가 적용됩니다. 이 문제를 해결하려면 Android Keystore 외부에서 사용할 공개 키 자료를 추출합니다. 예시:

{@code
            PublicKey unrestrictedPublicKey =
                    KeyFactory.getInstance(publicKey.getAlgorithm()).generatePublic(
                            new X509EncodedKeySpec(publicKey.getEncoded()));
            }

<h3>예제: GCM 모드에서 암호화/암호 해독을 위한 AES 키/h3> 이 예제에서는 패딩 없이 GCM 모드<에서 암호화/암호 해독에만 사용할 수 있는 권한 있는 별칭 key1 으로 AES 키를 Android KeyStore로 가져오는 방법을 보여 줍니다. 키는 형식을 통해 Key#getEncoded() RAW 키 자료를 내보내야 합니다.

{@code
            SecretKey key = ...; // AES key

            KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore");
            keyStore.load(null);
            keyStore.setEntry(
                    "key1",
                    new KeyStore.SecretKeyEntry(key),
                    new KeyProtection.Builder(KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT)
                            .setBlockMode(KeyProperties.BLOCK_MODE_GCM)
                            .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE)
                            .build());
            // Key imported, obtain a reference to it.
            SecretKey keyStoreKey = (SecretKey) keyStore.getKey("key1", null);
            // The original key can now be discarded.

            Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
            cipher.init(Cipher.ENCRYPT_MODE, keyStoreKey);
            ...
            }

<h3>예제: SHA-512/h3을 사용하여 MAC를 생성하기 위한 HMAC 키입니다.> 이 예제에서는 SHA-512< 다이제스트를 사용하여 MAC를 생성하는 데만 사용할 수 있는 별칭 key1 으로 HMAC 키를 Android KeyStore로 가져오는 방법을 보여 줍니다. 키는 형식을 통해 Key#getEncoded() RAW 키 자료를 내보내야 합니다.

{@code
            SecretKey key = ...; // HMAC key of algorithm "HmacSHA512".

            KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore");
            keyStore.load(null);
            keyStore.setEntry(
                    "key1",
                    new KeyStore.SecretKeyEntry(key),
                    new KeyProtection.Builder(KeyProperties.PURPOSE_SIGN).build());
            // Key imported, obtain a reference to it.
            SecretKey keyStoreKey = (SecretKey) keyStore.getKey("key1", null);
            // The original key can now be discarded.

            Mac mac = Mac.getInstance("HmacSHA512");
            mac.init(keyStoreKey);
            ...
            }

<h3>예제: ECDSA</h3> 을 사용한 서명/확인을 위한 EC 키 쌍입니다. 이 예제에서는 SHA-256 또는 SHA-512 다이제스트를 사용하여 서명하는 데만 사용할 권한이 있는 프라이빗 키를 사용하여 별칭 key2 으로 EC 키 쌍을 Android KeyStore로 가져오는 방법을 보여 줍니다. 공개 키의 사용은 제한되지 않습니다. 프라이빗 키와 공개 키는 각각 형식 PKCS#8X.509 형식을 통해 Key#getEncoded() 키 자료를 내보내야 합니다.

{@code
            PrivateKey privateKey = ...;   // EC private key
            Certificate[] certChain = ...; // Certificate chain with the first certificate
                                           // containing the corresponding EC public key.

            KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore");
            keyStore.load(null);
            keyStore.setEntry(
                    "key2",
                    new KeyStore.PrivateKeyEntry(privateKey, certChain),
                    new KeyProtection.Builder(KeyProperties.PURPOSE_SIGN)
                            .setDigests(KeyProperties.DIGEST_SHA256, KeyProperties.DIGEST_SHA512)
                            .build());
            // Key pair imported, obtain a reference to it.
            PrivateKey keyStorePrivateKey = (PrivateKey) keyStore.getKey("key2", null);
            PublicKey publicKey = keyStore.getCertificate("key2").getPublicKey();
            // The original private key can now be discarded.

            Signature signature = Signature.getInstance("SHA256withECDSA");
            signature.initSign(keyStorePrivateKey);
            ...
            }

<h3>예제: PKCS#1 패딩</h3을 사용하여 서명/확인을 위한 RSA 키 쌍입니다> . 이 예제에서는 SHA-256 다이제스트에서 PKCS#1 서명 패딩 체계를 사용하여 서명에만 사용할 수 있도록 권한이 부여된 프라이빗 키가 있는 별칭 key2 으로 RSA 키 쌍을 Android KeyStore로 가져오는 방법을 보여 줍니다. 공개 키의 사용은 제한되지 않습니다(알려진 문제 참조). 프라이빗 키와 공개 키는 각각 형식 PKCS#8X.509 형식을 통해 Key#getEncoded() 키 자료를 내보내야 합니다.

{@code
            PrivateKey privateKey = ...;   // RSA private key
            Certificate[] certChain = ...; // Certificate chain with the first certificate
                                           // containing the corresponding RSA public key.

            KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore");
            keyStore.load(null);
            keyStore.setEntry(
                    "key2",
                    new KeyStore.PrivateKeyEntry(privateKey, certChain),
                    new KeyProtection.Builder(KeyProperties.PURPOSE_SIGN)
                            .setDigests(KeyProperties.DIGEST_SHA256)
                            .setSignaturePaddings(KeyProperties.SIGNATURE_PADDING_RSA_PKCS1)
                            // Only permit this key to be used if the user
                            // authenticated within the last ten minutes.
                            .setUserAuthenticationRequired(true)
                            .setUserAuthenticationValidityDurationSeconds(10 * 60)
                            .build());
            // Key pair imported, obtain a reference to it.
            PrivateKey keyStorePrivateKey = (PrivateKey) keyStore.getKey("key2", null);
            PublicKey publicKey = keyStore.getCertificate("key2").getPublicKey();
            // The original private key can now be discarded.

            Signature signature = Signature.getInstance("SHA256withRSA");
            signature.initSign(keyStorePrivateKey);
            ...
            }

<h3>예제: PKCS#1 패딩/h3을 사용하여 암호화/암호 해독을 위한 RSA 키 쌍입니다.> 이 예제에서는 PKCS#1 암호화 패딩< 체계를 사용하여 암호 해독에만 사용할 수 있도록 권한이 부여된 프라이빗 키를 사용하여 별칭 key2 으로 RSA 키 쌍을 Android KeyStore로 가져오는 방법을 보여 줍니다. 공개 키의 사용은 제한되지 않으므로 패딩 체계 및 다이제스트를 사용하여 암호화를 허용합니다. 프라이빗 키와 공개 키는 각각 형식 PKCS#8X.509 형식을 통해 Key#getEncoded() 키 자료를 내보내야 합니다.

{@code
            PrivateKey privateKey = ...;   // RSA private key
            Certificate[] certChain = ...; // Certificate chain with the first certificate
                                           // containing the corresponding RSA public key.

            KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore");
            keyStore.load(null);
            keyStore.setEntry(
                    "key2",
                    new KeyStore.PrivateKeyEntry(privateKey, certChain),
                    new KeyProtection.Builder(KeyProperties.PURPOSE_DECRYPT)
                            .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_RSA_PKCS1)
                            .build());
            // Key pair imported, obtain a reference to it.
            PrivateKey keyStorePrivateKey = (PrivateKey) keyStore.getKey("key2", null);
            PublicKey publicKey = keyStore.getCertificate("key2").getPublicKey();
            // The original private key can now be discarded.

            Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
            cipher.init(Cipher.DECRYPT_MODE, keyStorePrivateKey);
            ...
            }

에 대한 android.security.keystore.KeyProtectionJava 설명서

이 페이지의 일부는 Android 오픈 소스 프로젝트에서 만들고 공유하고 Creative Commons 2.5 특성 라이선스에 설명된 용어에 따라 사용되는 작업을 기반으로 하는 수정 사항입니다.

속성

Class

Object런타임 클래스를 반환합니다.

(다음에서 상속됨 Object)
Handle

기본 Android 인스턴스에 대한 핸들입니다.

(다음에서 상속됨 Object)
IsDigestsSpecified

키를 사용할 수 있는 다이제스트 알고리즘 집합이 지정되었는지를 반환 true 합니다.

IsInvalidatedByBiometricEnrollment

새 생체 인식이 등록되거나 등록된 모든 생체 인식이 제거될 때 키가 돌이킬 수 없는 무효화되는지 여부를 반환 true 합니다.

IsRandomizedEncryptionRequired

매번 동일한 일반 텍스트에 대해 서로 다른 암호화 텍스트를 생성하기 위해 이 키를 사용하는 암호화를 충분히 임의로 지정해야 하는지를 반환 true 합니다.

IsUnlockedDeviceRequired

암호 해독 또는 서명에 이 키를 사용하려면 화면의 잠금을 해제해야 하는지 여부를 반환 true 합니다.

IsUserAuthenticationRequired

사용자가 인증된 경우에만 키를 사용할 수 있는 권한이 있는지 여부를 반환 true 합니다.

IsUserAuthenticationValidWhileOnBody

디바이스가 사용자의 본문에서 제거될 때 키가 권한이 해제되는지를 반환 true 합니다.

IsUserConfirmationRequired

키가 사용자가 확인한 메시지에만 사용할 수 있는 권한이 있는지를 반환 true 합니다.

IsUserPresenceRequired

키와 호출 간에 Signature.initSign() 사용자 존재 테스트가 수행된 경우에만 키를 사용할 수 있는 권한이 있는지를 반환 true 합니다Signature.sign().

JniIdentityHashCode

Android Keystore 시스템으로 가져올 때 키 또는 키 쌍을 보호하는 방법의 사양입니다.

(다음에서 상속됨 Object)
JniPeerMembers

Android Keystore 시스템으로 가져올 때 키 또는 키 쌍을 보호하는 방법의 사양입니다.

KeyValidityForConsumptionEnd

암호 해독 및 확인에 키가 더 이상 유효하지 않은 시간 인스턴트를 가져옵니다.

KeyValidityForOriginationEnd

키가 암호화 및 서명에 더 이상 유효하지 않은 시간 인스턴트를 가져옵니다.

KeyValidityStart

키가 아직 유효하지 않은 시간 인스턴트를 가져옵니다.

MaxUsageCount

제한된 사용 키를 사용할 수 있는 최대 횟수를 반환하거나 KeyProperties#UNRESTRICTED_USAGE_COUNT 키를 사용할 수 있는 횟수에 제한이 없는 경우 반환합니다.

PeerReference

Android Keystore 시스템으로 가져올 때 키 또는 키 쌍을 보호하는 방법의 사양입니다.

(다음에서 상속됨 Object)
Purposes

용도 집합을 가져옵니다(예:

ThresholdClass

이 API는 Android용 Mono 인프라를 지원하며 코드에서 직접 사용할 수 없습니다.

(다음에서 상속됨 Object)
ThresholdType

이 API는 Android용 Mono 인프라를 지원하며 코드에서 직접 사용할 수 없습니다.

(다음에서 상속됨 Object)
UserAuthenticationType

Android Keystore 시스템으로 가져올 때 키 또는 키 쌍을 보호하는 방법의 사양입니다.

UserAuthenticationValidityDurationSeconds

사용자가 성공적으로 인증된 후 이 키를 사용할 수 있는 권한이 부여된 시간(초)을 가져옵니다.

메서드

Clone()

이 개체의 복사본을 만들고 반환합니다.

(다음에서 상속됨 Object)
Dispose()

Android Keystore 시스템으로 가져올 때 키 또는 키 쌍을 보호하는 방법의 사양입니다.

(다음에서 상속됨 Object)
Dispose(Boolean)

Android Keystore 시스템으로 가져올 때 키 또는 키 쌍을 보호하는 방법의 사양입니다.

(다음에서 상속됨 Object)
Equals(Object)

다른 개체가 이 개체와 "같음"인지 여부를 나타냅니다.

(다음에서 상속됨 Object)
GetBlockModes()

블록 모드 집합을 가져옵니다(예:

GetDigests()

다이제스트 알고리즘 집합을 가져옵니다(예:

GetEncryptionPaddings()

패딩 구성표 집합을 가져옵니다(예:

GetHashCode()

개체에 대한 해시 코드 값을 반환합니다.

(다음에서 상속됨 Object)
GetSignaturePaddings()

패딩 구성표 집합을 가져옵니다(예:

JavaFinalize()

가비지 수집에서 개체에 대한 참조가 더 이상 없다고 판단할 때 개체의 가비지 수집기에서 호출됩니다.

(다음에서 상속됨 Object)
Notify()

이 개체의 모니터에서 대기 중인 단일 스레드를 해제합니다.

(다음에서 상속됨 Object)
NotifyAll()

이 개체의 모니터에서 대기 중인 모든 스레드를 해제합니다.

(다음에서 상속됨 Object)
SetHandle(IntPtr, JniHandleOwnership)

Handle 속성을 설정합니다.

(다음에서 상속됨 Object)
ToArray<T>()

Android Keystore 시스템으로 가져올 때 키 또는 키 쌍을 보호하는 방법의 사양입니다.

(다음에서 상속됨 Object)
ToString()

개체의 문자열 표현을 반환합니다.

(다음에서 상속됨 Object)
UnregisterFromRuntime()

Android Keystore 시스템으로 가져올 때 키 또는 키 쌍을 보호하는 방법의 사양입니다.

(다음에서 상속됨 Object)
Wait()

현재 스레드가 각성될 때까지 대기하게 하며, 일반적으로 <알림을 받<>거나 <><중단/종료>합니다.>

(다음에서 상속됨 Object)
Wait(Int64, Int32)

현재 스레드가 각성될 때까지 대기하게 하며, 일반적으로 <>알림을 받<거나 <중단/>종료><>하거나 일정량의 실시간 경과가 발생할 때까지 대기합니다.

(다음에서 상속됨 Object)
Wait(Int64)

현재 스레드가 각성될 때까지 대기하게 하며, 일반적으로 <>알림을 받<거나 <중단/>종료><>하거나 일정량의 실시간 경과가 발생할 때까지 대기합니다.

(다음에서 상속됨 Object)

명시적 인터페이스 구현

IJavaPeerable.Disposed()

Android Keystore 시스템으로 가져올 때 키 또는 키 쌍을 보호하는 방법의 사양입니다.

(다음에서 상속됨 Object)
IJavaPeerable.DisposeUnlessReferenced()

Android Keystore 시스템으로 가져올 때 키 또는 키 쌍을 보호하는 방법의 사양입니다.

(다음에서 상속됨 Object)
IJavaPeerable.Finalized()

Android Keystore 시스템으로 가져올 때 키 또는 키 쌍을 보호하는 방법의 사양입니다.

(다음에서 상속됨 Object)
IJavaPeerable.JniManagedPeerState

Android Keystore 시스템으로 가져올 때 키 또는 키 쌍을 보호하는 방법의 사양입니다.

(다음에서 상속됨 Object)
IJavaPeerable.SetJniIdentityHashCode(Int32)

Android Keystore 시스템으로 가져올 때 키 또는 키 쌍을 보호하는 방법의 사양입니다.

(다음에서 상속됨 Object)
IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates)

Android Keystore 시스템으로 가져올 때 키 또는 키 쌍을 보호하는 방법의 사양입니다.

(다음에서 상속됨 Object)
IJavaPeerable.SetPeerReference(JniObjectReference)

Android Keystore 시스템으로 가져올 때 키 또는 키 쌍을 보호하는 방법의 사양입니다.

(다음에서 상속됨 Object)

확장 메서드

JavaCast<TResult>(IJavaObject)

Android 런타임 확인 형식 변환을 수행합니다.

JavaCast<TResult>(IJavaObject)

Android Keystore 시스템으로 가져올 때 키 또는 키 쌍을 보호하는 방법의 사양입니다.

GetJniTypeName(IJavaPeerable)

Android Keystore 시스템으로 가져올 때 키 또는 키 쌍을 보호하는 방법의 사양입니다.

적용 대상