KeyProtection 클래스
정의
중요
일부 정보는 릴리스되기 전에 상당 부분 수정될 수 있는 시험판 제품과 관련이 있습니다. Microsoft는 여기에 제공된 정보에 대해 어떠한 명시적이거나 묵시적인 보증도 하지 않습니다.
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
- 상속
- 특성
- 구현
설명
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#8
및 X.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#8
및 X.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#8
및 X.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.KeyProtection
Java 설명서
이 페이지의 일부는 Android 오픈 소스 프로젝트에서 만들고 공유하고 Creative Commons 2.5 특성 라이선스에 설명된 용어에 따라 사용되는 작업을 기반으로 하는 수정 사항입니다.
속성
Class |
이 |
Handle |
기본 Android 인스턴스에 대한 핸들입니다. (다음에서 상속됨 Object) |
IsDigestsSpecified |
키를 사용할 수 있는 다이제스트 알고리즘 집합이 지정되었는지를 반환 |
IsInvalidatedByBiometricEnrollment |
새 생체 인식이 등록되거나 등록된 모든 생체 인식이 제거될 때 키가 돌이킬 수 없는 무효화되는지 여부를 반환 |
IsRandomizedEncryptionRequired |
매번 동일한 일반 텍스트에 대해 서로 다른 암호화 텍스트를 생성하기 위해 이 키를 사용하는 암호화를 충분히 임의로 지정해야 하는지를 반환 |
IsUnlockedDeviceRequired |
암호 해독 또는 서명에 이 키를 사용하려면 화면의 잠금을 해제해야 하는지 여부를 반환 |
IsUserAuthenticationRequired |
사용자가 인증된 경우에만 키를 사용할 수 있는 권한이 있는지 여부를 반환 |
IsUserAuthenticationValidWhileOnBody |
디바이스가 사용자의 본문에서 제거될 때 키가 권한이 해제되는지를 반환 |
IsUserConfirmationRequired |
키가 사용자가 확인한 메시지에만 사용할 수 있는 권한이 있는지를 반환 |
IsUserPresenceRequired |
키와 호출 간에 |
JniIdentityHashCode |
Android Keystore 시스템으로 가져올 때 키 또는 키 쌍을 보호하는 방법의 사양입니다. (다음에서 상속됨 Object) |
JniPeerMembers |
Android Keystore 시스템으로 가져올 때 키 또는 키 쌍을 보호하는 방법의 사양입니다. |
KeyValidityForConsumptionEnd |
암호 해독 및 확인에 키가 더 이상 유효하지 않은 시간 인스턴트를 가져옵니다. |
KeyValidityForOriginationEnd |
키가 암호화 및 서명에 더 이상 유효하지 않은 시간 인스턴트를 가져옵니다. |
KeyValidityStart |
키가 아직 유효하지 않은 시간 인스턴트를 가져옵니다. |
MaxUsageCount |
제한된 사용 키를 사용할 수 있는 최대 횟수를 반환하거나 |
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 시스템으로 가져올 때 키 또는 키 쌍을 보호하는 방법의 사양입니다. |