public static final class KeyGenParameterSpec.Builder
extends Object
java.lang.Object | |
↳ | android.security.keystore.KeyGenParameterSpec.Builder |
KeyGenParameterSpec
实例的构建器。
Public constructors |
|
---|---|
KeyGenParameterSpec.Builder(String keystoreAlias, int purposes) 创建 |
Inherited methods |
|
---|---|
From class java.lang.Object
|
KeyGenParameterSpec.Builder (String keystoreAlias, int purposes)
创建 Builder
的新实例。
Parameters | |
---|---|
keystoreAlias |
String : alias of the entry in which the generated key will appear in Android KeyStore. Must not be empty. |
purposes |
int : set of purposes (e.g., encrypt, decrypt, sign) for which the key can be used. Attempts to use the key for any other purpose will be rejected. 如果可以使用该密钥的一组目的不包含 见 |
KeyGenParameterSpec build ()
构建一个 KeyGenParameterSpec
的实例。
Returns | |
---|---|
KeyGenParameterSpec |
KeyGenParameterSpec.Builder setAlgorithmParameterSpec (AlgorithmParameterSpec spec)
设置算法特定的密钥生成参数。 例如,对于RSA密钥,这可以是RSAKeyGenParameterSpec
的实例,而对于EC密钥,这可以是ECGenParameterSpec
的实例。
这些密钥生成参数必须与其他明确设置的参数(如果有)匹配,例如密钥大小。
Parameters | |
---|---|
spec |
AlgorithmParameterSpec
|
Returns | |
---|---|
KeyGenParameterSpec.Builder |
KeyGenParameterSpec.Builder setAttestationChallenge (byte[] attestationChallenge)
设置是否为该密钥对生成证明证书,以及将在证书中放置什么质询值。 认证证书链可以与getCertificateChain(String)
一起检索。
如果attestationChallenge
不是null
,则此密钥对的公钥证书将包含描述密钥配置和授权详细信息(包括attestationChallenge
值)的attestationChallenge
。 如果密钥处于安全硬件中,并且安全硬件支持证明,则证书将通过以可信CA密钥为根的证书链进行签名。 否则,该链将植根于不受信任的证书。
挑战价值的目的是使依赖方能够验证密钥是根据特定请求创建的。 如果需要证明,但不需要挑战,则可以使用任何非null
值,包括空字节数组。
如果attestationChallenge
为null
,并且此规范用于生成非对称(RSA或EC)密钥对,则如果密钥具有目的PURPOSE_SIGN
,则公钥证书将为自签名。 如果密钥不具有目的PURPOSE_SIGN
,则不可能使用该密钥签署证书,因此公钥证书将包含虚拟签名。
对称密钥(如AES和HMAC密钥)没有公钥证书。 如果getAttestationChallenge()
返回非空并且该规范用于生成对称(AES或HMAC)密钥,则generateKey()
将抛出InvalidAlgorithmParameterException
。
Parameters | |
---|---|
attestationChallenge |
byte
|
Returns | |
---|---|
KeyGenParameterSpec.Builder |
KeyGenParameterSpec.Builder setBlockModes (String... blockModes)
设置组的块模式(例如, GCM
, CBC
)与该密钥可以加密/解密时使用。 试图在任何其他模块模式下使用密钥将被拒绝。
这必须为对称加密/解密密钥指定。
见KeyProperties
。 BLOCK_MODE
常数。
Parameters | |
---|---|
blockModes |
String
|
Returns | |
---|---|
KeyGenParameterSpec.Builder |
KeyGenParameterSpec.Builder setCertificateNotAfter (Date date)
设置生成的密钥对的自签名证书的有效期结束。
默认情况下,这个日期是 Jan 1 2048
。
Parameters | |
---|---|
date |
Date
|
Returns | |
---|---|
KeyGenParameterSpec.Builder |
KeyGenParameterSpec.Builder setCertificateNotBefore (Date date)
设置生成的密钥对的自签名证书的有效期开始。
默认情况下,这个日期是 Jan 1 1970
。
Parameters | |
---|---|
date |
Date
|
Returns | |
---|---|
KeyGenParameterSpec.Builder |
KeyGenParameterSpec.Builder setCertificateSerialNumber (BigInteger serialNumber)
设置用于生成密钥对的自签名证书的序列号。
默认情况下,序列号是 1
。
Parameters | |
---|---|
serialNumber |
BigInteger
|
Returns | |
---|---|
KeyGenParameterSpec.Builder |
KeyGenParameterSpec.Builder setCertificateSubject (X500Principal subject)
设置用于生成的密钥对的自签名证书的主题。
默认情况下,主题是 CN=fake
。
Parameters | |
---|---|
subject |
X500Principal
|
Returns | |
---|---|
KeyGenParameterSpec.Builder |
KeyGenParameterSpec.Builder setDigests (String... digests)
设置组的摘要算法(例如, SHA-256
, SHA-384
)与该键可被使用。 试图将密钥与任何其他摘要算法一起使用将被拒绝。
这必须指定用于RSA OAEP填充方案的签名/验证密钥和RSA加密/解密密钥,因为这些操作涉及摘要。 为HMAC键,默认是与密钥算法(例如,相关联的摘要SHA-256
为密钥算法HmacSHA256
)。 HMAC密钥不能被授权用于多个摘要。
对于用于TLS / SSL客户端或服务器身份验证的私钥,通常需要授权使用无摘要( DIGEST_NONE
)。 这是因为TLS / SSL堆栈通常会自己生成必要的摘要,然后使用私钥对其进行签名。
见KeyProperties
。 DIGEST
常数。
Parameters | |
---|---|
digests |
String
|
Returns | |
---|---|
KeyGenParameterSpec.Builder |
KeyGenParameterSpec.Builder setEncryptionPaddings (String... paddings)
设置组填充方案(例如, PKCS7Padding
, OAEPPadding
, PKCS1Padding
, NoPadding
)与该密钥可以加密/解密时使用。 尝试将密钥与任何其他填充方案一起使用将被拒绝。
这必须为用于加密/解密的密钥指定。
对于TLS / SSL服务器用于向客户端认证自己的RSA私钥,通常需要授权使用不/任何填充( ENCRYPTION_PADDING_NONE
)和/或PKCS#1加密填充( ENCRYPTION_PADDING_RSA_PKCS1
)。 这是因为某些密码套件需要RSA解密,并且某些堆栈请求使用不填充的解密,而另一些则请求PKCS#1填充。
见KeyProperties
。 ENCRYPTION_PADDING
常量。
Parameters | |
---|---|
paddings |
String
|
Returns | |
---|---|
KeyGenParameterSpec.Builder |
KeyGenParameterSpec.Builder setInvalidatedByBiometricEnrollment (boolean invalidateKey)
设置此密钥是否应在指纹登记时失效。 这仅适用于需要用户身份验证的密钥(请参阅setUserAuthenticationRequired(boolean)
),并且未设置正确的有效持续时间(请参阅setUserAuthenticationValidityDurationSeconds(int)
,这意味着密钥仅对指纹身份验证有效。
默认情况下, invalidateKey
为true
,因此只有在指纹认证有效的密钥才会在注册新指纹或删除所有现有指纹时发生不可逆转的无效 。 通过调用invalidateKey
设置为false
方法可能会改变这种false
。
在注册新手指或取消所有手指注册时使密钥无效可通过确保获得密码的未授权人员无法通过注册自己的手指来获得使用经过指纹认证的密钥来提高安全性。 但是,使密钥无效使得不可能进行与密钥相关的操作,需要一些回退过程来验证用户并设置新的密钥。
Parameters | |
---|---|
invalidateKey |
boolean
|
Returns | |
---|---|
KeyGenParameterSpec.Builder |
KeyGenParameterSpec.Builder setKeySize (int keySize)
设置要生成的密钥的大小(以位为单位)。 例如,对于RSA密钥,这设置模数大小,对于EC密钥,这选择具有匹配字段大小的曲线,并且对于对称密钥,这设置作为其密钥材料的位串的大小。
默认密钥大小是每个密钥算法特有的。 如果密钥大小未通过此方法设置,则应从通过setAlgorithmParameterSpec
提供的算法特定参数(如果有)中setAlgorithmParameterSpec
。
Parameters | |
---|---|
keySize |
int
|
Returns | |
---|---|
KeyGenParameterSpec.Builder |
KeyGenParameterSpec.Builder setKeyValidityEnd (Date endDate)
设置密钥不再有效的时间。
默认情况下,密钥在任何时刻均有效。
Parameters | |
---|---|
endDate |
Date
|
Returns | |
---|---|
KeyGenParameterSpec.Builder |
KeyGenParameterSpec.Builder setKeyValidityForConsumptionEnd (Date endDate)
设置密钥不再有效用于解密和验证的时间。
默认情况下,密钥在任何时刻均有效。
Parameters | |
---|---|
endDate |
Date
|
Returns | |
---|---|
KeyGenParameterSpec.Builder |
KeyGenParameterSpec.Builder setKeyValidityForOriginationEnd (Date endDate)
设置密钥不再有效用于加密和签名的时间。
默认情况下,密钥在任何时刻均有效。
Parameters | |
---|---|
endDate |
Date
|
Returns | |
---|---|
KeyGenParameterSpec.Builder |
KeyGenParameterSpec.Builder setKeyValidityStart (Date startDate)
设置密钥尚未生效的时间。
默认情况下,密钥在任何时刻均有效。
Parameters | |
---|---|
startDate |
Date
|
Returns | |
---|---|
KeyGenParameterSpec.Builder |
也可以看看:
KeyGenParameterSpec.Builder setRandomizedEncryptionRequired (boolean required)
设置使用此密钥的加密是否必须充分随机化,以便每次为相同的明文生成不同的密文。 所需的正式密码属性在选择明文攻击( IND-CPA
)下不可区分 。 这个属性很重要,因为它可以缓解由于密文泄露明文信息而导致的几类弱点。 例如,如果一个给定的明文总是产生相同的密文,攻击者可能会看到重复的密文,并能够推断出有关明文的信息。
默认情况下,需要 IND-CPA
。
当需要 IND-CPA
时:
IND-CPA
, such as ECB
with a symmetric encryption algorithm, or RSA encryption/decryption without padding, are prohibited;GCM
, CBC
, and CTR
, caller-provided IVs are rejected when encrypting, to ensure that only random IVs are used.在禁用此要求之前,请考虑采用以下方法:
Cipher using the IV, the solution is to let the Cipher
generate a random IV instead. This will occur if the Cipher
is initialized for encryption without an IV. The IV can then be queried via getIV()
.IND-CPA
, such as PKCS#1 or OAEP.Parameters | |
---|---|
required |
boolean
|
Returns | |
---|---|
KeyGenParameterSpec.Builder |
KeyGenParameterSpec.Builder setSignaturePaddings (String... paddings)
设置组填充方案(例如, PSS
, PKCS#1
)与该密钥可以签名/验证时使用。 尝试将密钥与任何其他填充方案一起使用将被拒绝。
这必须为用于签名/验证的RSA密钥指定。
见KeyProperties
。 SIGNATURE_PADDING
常量。
Parameters | |
---|---|
paddings |
String
|
Returns | |
---|---|
KeyGenParameterSpec.Builder |
KeyGenParameterSpec.Builder setUserAuthenticationRequired (boolean required)
设置此密钥是否仅在用户已通过身份验证时才有权使用。
默认情况下,无论用户是否通过身份验证,密钥都有权使用。
当需要用户认证时:
isDeviceSecure()
). Additionally, if the key requires that user authentication takes place for every use of the key (see setUserAuthenticationValidityDurationSeconds(int)
), at least one fingerprint must be enrolled (see hasEnrolledFingerprints()
).setInvalidatedByBiometricEnrollment(boolean)
is used to allow validity after enrollment. Attempts to initialize cryptographic operations using such keys will throw KeyPermanentlyInvalidatedException
.此授权仅适用于密钥和私钥操作。 公钥操作不受限制。
Parameters | |
---|---|
required |
boolean
|
Returns | |
---|---|
KeyGenParameterSpec.Builder |
KeyGenParameterSpec.Builder setUserAuthenticationValidWhileOnBody (boolean remainsValid)
设置密钥是否保持授权状态,直到设备从用户身上移除到验证有效期限setUserAuthenticationValidityDurationSeconds(int)
(请参阅setUserAuthenticationValidityDurationSeconds(int)
和setUserAuthenticationRequired(boolean)
)。 一旦设备从用户身上移除,该密钥将被视为未经授权,用户需要重新进行身份验证才能使用该密钥。 对于没有认证有效期的密钥,此参数不起作用。
同样,在没有身上传感器的设备上,该参数将不起作用; 该设备将始终被视为“贴身”,因此该钥匙将保持授权,直至有效期结束。
Parameters | |
---|---|
remainsValid |
boolean : if true , and if the device supports on-body detection, key will be invalidated when the device is removed from the user's body or when the authentication validity expires, whichever occurs first. |
Returns | |
---|---|
KeyGenParameterSpec.Builder |
KeyGenParameterSpec.Builder setUserAuthenticationValidityDurationSeconds (int seconds)
设置用户成功通过身份验证后授权使用此密钥的持续时间(秒)。 如果密钥需要用户身份验证才能使用(请参阅setUserAuthenticationRequired(boolean)
),这会起作用。
默认情况下,如果需要用户身份验证,则必须在每次使用密钥时进行。
涉及需要对每个操作进行用户认证的密钥的加密操作只能使用指纹认证。 这是通过初始化密码操作(实现Signature
, Cipher
, Mac
)与密钥,包成一个FingerprintManager.CryptoObject
,调用FingerprintManager.authenticate
与CryptoObject
,并用仅当所述认证成功流密码操作进行。
涉及在成功的用户认证事件之后被授权使用一段时间的密钥的加密操作只能使用安全锁屏认证。 如果用户需要进行身份验证才能继续,则这些加密操作将在初始化期间抛出UserNotAuthenticatedException
。 这种情况可以通过用户解锁Android的安全锁屏或者通过createConfirmDeviceCredentialIntent(CharSequence, CharSequence)
启动的确认凭证流程来createConfirmDeviceCredentialIntent(CharSequence, CharSequence)
。 一旦解决,在用户身份验证流程成功完成的情况下,使用此密钥(或任何其他授权在用户身份验证后使用一段固定时间的密钥)初始化新的加密操作应能成功。
Parameters | |
---|---|
seconds |
int : duration in seconds or -1 if user authentication must take place for every use of the key. |
Returns | |
---|---|
KeyGenParameterSpec.Builder |