Поделиться через


KeyProtection Класс

Определение

Спецификация защиты пары ключей или ключей при импорте в систему Хранилища ключей Android.

[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. Этот класс указывает авторизованное использование импортированного ключа, например, требуется ли проверка подлинности пользователя для использования ключа, какие операции разрешены ключу (например, расшифровка, но не подписывание) с параметрами (например, только с определенной схемой заполнения или дайджестом), а также срок действия ключа для начала и окончания. Использование ключей, выраженных в этом классе, применяется только к секретным ключам и закрытым ключам. Открытые ключи можно использовать для любых поддерживаемых операций.

Чтобы импортировать пару ключей или ключей в Хранилище ключей Android, создайте экземпляр этого класса с помощью Builder экземпляра и передайте экземпляр с java.security.KeyStore#setEntry(String, java.security.KeyStore.Entry, ProtectionParameter) KeyStore.setEntry импортируемой парой ключей или ключей.

Получение секрета или симметричного или закрытого ключа из использования java.security.KeyStore#getKey(String, char[]) KeyStore.getKey(String, null) хранилища ключей Android или java.security.KeyStore#getEntry(String, java.security.KeyStore.ProtectionParameter) KeyStore.getEntry(String, null). Чтобы получить открытый ключ из хранилища java.security.KeyStore#getCertificate(String) ключей Android, и затем Certificate#getPublicKey().

Чтобы получить открытые параметры, относящиеся к алгоритму, пары ключей, хранящиеся в хранилище ключей Android, его закрытые ключи реализуют или интерфейсы, а открытые ключи реализуют java.security.interfaces.ECKey java.security.interfaces.ECPublicKey или java.security.interfaces.RSAKey java.security.interfaces.RSAPublicKey интерфейсы.

ПРИМЕЧАНИЕ. Основные материалы ключей, хранящиеся в хранилище ключей Android, недоступны.

Экземпляры этого класса неизменяемы.

<h3 Известные проблемы</h3>> Известная ошибка в Android 6.0 (уровень API 23) приводит к применению авторизации, связанных с проверкой подлинности пользователей, даже для открытых ключей. Чтобы обойти эту проблему, извлеките материал открытого ключа для использования за пределами Хранилища ключей Android. Например:

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

<Пример h3>. Ключ AES для шифрования и расшифровки в режиме< GCM/h3> в этом примере демонстрирует, как импортировать ключ AES в Android KeyStore под псевдонимом key1 , авторизованным для шифрования и расшифровки в режиме GCM без заполнения. Ключ должен экспортировать свой ключевой материал с RAW помощью Key#getEncoded() формата.

{@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>. Ключ HMAC для создания MAC с помощью SHA-512</h3> в этом примере демонстрирует импорт ключа HMAC в Android KeyStore под псевдонимом key1 , авторизованным для создания macs с помощью дайджеста SHA-512. Ключ должен экспортировать свой ключевой материал с RAW помощью Key#getEncoded() формата.

{@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>. Пара ключей EC для подписывания и проверки с помощью ECDSA</h3> в этом примере демонстрирует, как импортировать пару ключей EC в Android KeyStore под псевдонимом key2 с закрытым ключом, авторизованным использовать только для подписывания с дайджестами SHA-256 или SHA-512. Использование открытого ключа является неограниченным. Как закрытый, так и открытый ключ должны экспортировать свои ключевые материалы в Key#getEncoded() PKCS#8 формате и X.509 соответственно.

{@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>Пример. Пара ключей RSA для подписи и проверки с помощью PKCS#1 padding</h3> в этом примере иллюстрирует импорт пары ключей RSA в Android KeyStore под псевдонимом key2 с авторизованным закрытым ключом для подписи с помощью схемы подписи PKCS#1 с помощью дайджеста SHA-256 и только в том случае, если пользователь прошел проверку подлинности за последние десять минут. Использование открытого ключа является неограниченным (см. раздел "Известные проблемы"). Как закрытый, так и открытый ключ должны экспортировать свои ключевые материалы в Key#getEncoded() PKCS#8 формате и X.509 соответственно.

{@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);
            ...
            }

<>Пример: пара ключей RSA для шифрования и расшифровки с помощью PKCS#1 padding</h3> в этом примере демонстрирует импорт пары ключей RSA в Android KeyStore под псевдонимом key2 с закрытым ключом, авторизованным для расшифровки с помощью схемы шифрования PKCS#1. Использование открытого ключа является неограниченным, что позволяет шифрованию использовать любые схемы заполнения и дайджесты. Как закрытый, так и открытый ключ должны экспортировать свои ключевые материалы в Key#getEncoded() PKCS#8 формате и X.509 соответственно.

{@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);
            ...
            }

Документация по Java для android.security.keystore.KeyProtection.

Части этой страницы — это изменения на основе работы, созданной и общей проектом с открытым исходным кодом Android и используемой в соответствии с условиями, описанными в лицензии Creative Commons 2.5 Attribution.

Свойства

Class

Возвращает класс среды выполнения этого Objectобъекта.

(Унаследовано от Object)
Handle

Дескриптор базового экземпляра Android.

(Унаследовано от Object)
IsDigestsSpecified

Возвращает, true если задан набор алгоритмов дайджеста, с которым можно использовать ключ.

IsInvalidatedByBiometricEnrollment

Возвращает, true если ключ необратимо недопустим при регистрации новой биометрии или удаляются все зарегистрированные биометрические данные.

IsRandomizedEncryptionRequired

Возвращает, true если шифрование с помощью этого ключа должно быть достаточно случайным для создания разных шифров для одного и того же открытого текста каждый раз.

IsUnlockedDeviceRequired

Возвращает, true если экран должен быть разблокирован, чтобы этот ключ использовался для расшифровки или подписывания.

IsUserAuthenticationRequired

Возвращает, true если ключ авторизован только в том случае, если пользователь прошел проверку подлинности.

IsUserAuthenticationValidWhileOnBody

Возвращает, true будет ли ключ удален из тела пользователя.

IsUserConfirmationRequired

Возвращает, true если ключ разрешен только для сообщений, подтвержденных пользователем.

IsUserPresenceRequired

Возвращает, true если ключ авторизован для использования только в том случае, если тест присутствия пользователя был выполнен между Signature.initSign() вызовами.Signature.sign()

JniIdentityHashCode

Спецификация защиты пары ключей или ключей при импорте в систему Хранилища ключей Android.

(Унаследовано от Object)
JniPeerMembers

Спецификация защиты пары ключей или ключей при импорте в систему Хранилища ключей Android.

KeyValidityForConsumptionEnd

Возвращает момент времени, после которого ключ долго не действителен для расшифровки и проверки.

KeyValidityForOriginationEnd

Возвращает момент времени, после которого ключ не является допустимым для шифрования и подписывания.

KeyValidityStart

Возвращает момент времени, до которого ключ еще не действителен.

MaxUsageCount

Возвращает максимальное количество раз, когда разрешено использовать ключ ограниченного использования или KeyProperties#UNRESTRICTED_USAGE_COUNT если не существует ограничений на количество использования ключа.

PeerReference

Спецификация защиты пары ключей или ключей при импорте в систему Хранилища ключей Android.

(Унаследовано от Object)
Purposes

Возвращает набор целей (e).

ThresholdClass

Этот API поддерживает инфраструктуру Mono для Android и не предназначен для использования непосредственно из кода.

(Унаследовано от Object)
ThresholdType

Этот API поддерживает инфраструктуру Mono для Android и не предназначен для использования непосредственно из кода.

(Унаследовано от Object)
UserAuthenticationType

Спецификация защиты пары ключей или ключей при импорте в систему Хранилища ключей Android.

UserAuthenticationValidityDurationSeconds

Получает продолжительность времени (секунды), для которого этот ключ авторизован после успешной проверки подлинности пользователя.

Методы

Clone()

Создает и возвращает копию этого объекта.

(Унаследовано от Object)
Dispose()

Спецификация защиты пары ключей или ключей при импорте в систему Хранилища ключей Android.

(Унаследовано от Object)
Dispose(Boolean)

Спецификация защиты пары ключей или ключей при импорте в систему Хранилища ключей Android.

(Унаследовано от Object)
Equals(Object)

Указывает, равен ли другой объект этому объекту.

(Унаследовано от Object)
GetBlockModes()

Возвращает набор режимов блоков (e).

GetDigests()

Возвращает набор алгоритмов дайджеста (e).

GetEncryptionPaddings()

Получает набор схем заполнения (e).

GetHashCode()

Возвращает значение хэш-кода для объекта.

(Унаследовано от Object)
GetSignaturePaddings()

Получает набор схем заполнения (e).

JavaFinalize()

Вызывается сборщиком мусора в объекте, когда сборка мусора определяет, что больше ссылок на объект нет.

(Унаследовано от Object)
Notify()

Пробуждение одного потока, ожидающего монитора этого объекта.

(Унаследовано от Object)
NotifyAll()

Просыпает все потоки, ожидающие монитора этого объекта.

(Унаследовано от Object)
SetHandle(IntPtr, JniHandleOwnership)

Задает свойство Handle.

(Унаследовано от Object)
ToArray<T>()

Спецификация защиты пары ключей или ключей при импорте в систему Хранилища ключей Android.

(Унаследовано от Object)
ToString()

Возвращает строковое представление объекта.

(Унаследовано от Object)
UnregisterFromRuntime()

Спецификация защиты пары ключей или ключей при импорте в систему Хранилища ключей Android.

(Унаследовано от Object)
Wait()

Приводит к тому, что текущий поток будет ждать, пока он не проснется, как правило, при <>помощи уведомления</em> или <эм>прерванного</em>.

(Унаследовано от Object)
Wait(Int64, Int32)

Приводит к тому, что текущий поток будет ждать, пока он не проснется, как правило, при <>получении уведомления</>em или <>эм прервано< или> до тех пор, пока не истекло определенное количество реального времени.

(Унаследовано от Object)
Wait(Int64)

Приводит к тому, что текущий поток будет ждать, пока он не проснется, как правило, при <>получении уведомления</>em или <>эм прервано< или> до тех пор, пока не истекло определенное количество реального времени.

(Унаследовано от Object)

Явные реализации интерфейса

IJavaPeerable.Disposed()

Спецификация защиты пары ключей или ключей при импорте в систему Хранилища ключей Android.

(Унаследовано от Object)
IJavaPeerable.DisposeUnlessReferenced()

Спецификация защиты пары ключей или ключей при импорте в систему Хранилища ключей Android.

(Унаследовано от Object)
IJavaPeerable.Finalized()

Спецификация защиты пары ключей или ключей при импорте в систему Хранилища ключей Android.

(Унаследовано от Object)
IJavaPeerable.JniManagedPeerState

Спецификация защиты пары ключей или ключей при импорте в систему Хранилища ключей Android.

(Унаследовано от Object)
IJavaPeerable.SetJniIdentityHashCode(Int32)

Спецификация защиты пары ключей или ключей при импорте в систему Хранилища ключей Android.

(Унаследовано от Object)
IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates)

Спецификация защиты пары ключей или ключей при импорте в систему Хранилища ключей Android.

(Унаследовано от Object)
IJavaPeerable.SetPeerReference(JniObjectReference)

Спецификация защиты пары ключей или ключей при импорте в систему Хранилища ключей Android.

(Унаследовано от Object)

Методы расширения

JavaCast<TResult>(IJavaObject)

Выполняет преобразование типа, проверяемого средой выполнения Android.

JavaCast<TResult>(IJavaObject)

Спецификация защиты пары ключей или ключей при импорте в систему Хранилища ключей Android.

GetJniTypeName(IJavaPeerable)

Спецификация защиты пары ключей или ключей при импорте в систему Хранилища ключей Android.

Применяется к