Concepts

Store and entry passwords

Java keystores usually involve two kinds of passwords:
  • Passwords to protect individual key entries
  • A password to protect the integrity of the keystore as a whole

These passwords serve different purposes: the individual key passwords serve as secret material for encrypting the entries with a PBE algorithm (Password-Based Encryption). The store password is typically used to detect tampering of the store by using it as part of the input to a cryptographic hash calculation or as a key for a MAC.

In the general case, each entry in the store can have a different password associated with it, with an additional final password being used for the keystore integrity check. To reduce the amount of passwords that needs to be kept track of though, it is common for a single password to be used for both the store integrity as well as all individual key entries.

To support the common case where key entries are protected using the store password, the load and loads class functions exposed by the different supported store types in pyjks contain a try_decrypt_keys keyword argument.

If set to True, the function will automatically try to decrypt each key entry it encounters using the store password. Any entry that fails to decrypt with the store password must therefore have been stored using a different password, and is left alone for the user to manually call decrypt() on afterwards.

Store types

JKS:
  • Key protection algorithm: proprietary JavaSoft algorithm (1.3.6.1.4.1.42.2.17.1.1)
  • Store signature algorithm: SHA-1 hash
JCEKS:
  • Key protection algorithm: proprietary PBE_WITH_MD5_AND_DES3_CBC (1.3.6.1.4.1.42.2.19.1)
  • Store signature algorithm: SHA-1 hash
BKS:
  • Key protection algorithm: PBEWithSHAAnd3KeyTripleDESCBC (1.2.840.113549.1.12.1.3)
  • Store signature algorithm: HMAC-SHA1
UBER:
  • Key protection algorithm: PBEWithSHAAnd3KeyTripleDESCBC (1.2.840.113549.1.12.1.3)
  • Store signature algorithm: SHA-1 hash
  • Store encryption algorithm: PBEWithSHAAndTwofishCBC (unknown OID, proprietary?)