Java Generate Key From Password
I was using a similar approach to generate salted Keys for AES-256. However, now I have to generate Keys just from a password (with no salt and no iterations), and I need them to work for AES-128, AES-192 and AES-256. My question is, does this code return Keys compatible with every AES-XXX size, or should I write diferent code for each size? Learn Java Secure Hashing algorithms in-depth. Java examples of MD5, SHA256, SHA512, PBKDF2, BCrypt, SCrypt algorithms with salt to create secure passwords.
Apr 03, 2020 Our first hash function is the MD5 message-digest algorithm, developed way back in 1992. Java's MessageDigest makes this easy to calculate and can still be useful in other circumstances. However, over the last several years, MD5 was discovered to fail the fourth password hashing property in that it became computationally easy to generate collisions. Generate a random 128-bit key (k1), a random 128-bit IV, and a random salt (64 bits is probably sufficient). Use PBKDF2 to generate a 256-bit key from your password and the salt, then split that into two 128-bit keys (k2, k3). Make sure your algorithm's native output is at least 256 bits, or this will be slow. Some people prefer to generate passwords which are 14 or 20 characters in length. If you’re creating a master password that you’ll need to remember, try using phrases or lyrics from your favorite movie or song. Just add random characters, but don't replace them in easy patterns. Use a password manager like LastPass to save your passwords. @bdares If I use a portion of a 256 bit hash to get a key of 128 or 192 bits, then two different passwords could generate the same truncated key. – Mister Smith Sep 19 '11 at 7:52 that, alas, is so very true. Jul 06, 2019. Generates a one-time password using the given key and counter value. @param key the key to be used to generate the password. @param counter the counter value for which to generate the password. @return an integer representation of a one-time password; callers will need to format the password for display. on their own.
Related
Introduction
Java Keytool is a key and certificate management tool that is used to manipulate Java Keystores, and is included with Java. A Java Keystore is a container for authorization certificates or public key certificates, and is often used by Java-based applications for encryption, authentication, and serving over HTTPS. Its entries are protected by a keystore password. A keystore entry is identified by an alias, and it consists of keys and certificates that form a trust chain.
This cheat sheet-style guide provides a quick reference to keytool
commands that are commonly useful when working with Java Keystores. This includes creating and modifying Java Keystores so they can be used with your Java applications.
How to Use This Guide:
- If you are not familiar with certificate signing requests (CSRs), read the CSR section of our OpenSSL cheat sheet
- This guide is in a simple, cheat sheet format–self-contained command line snippets
- Jump to any section that is relevant to the task you are trying to complete (Hint: use the Contents menu on the bottom-left or your browser’s Find function)
- Most of the commands are one-liners that have been expanded to multiple lines (using the
symbol) for clarity
Creating and Importing Keystore Entries
This section covers Java Keytool commands that are related to generating key pairs and certificates, and importing certificates.
Generate Keys in New/Existing Keystore
Use this method if you want to use HTTP (HTTP over TLS) to secure your Java application. This will create a new key pair in a new or existing Java Keystore, which can be used to create a CSR, and obtain an SSL certificate from a Certificate Authority.
This command generates a 2048-bit RSA key pair, under the specified alias (domain
), in the specified keystore file (keystore.jks
):
If the specified keystore does not already exist, it will be created after the requested information is supplied. This will prompt for the keystore password (new or existing), followed by a Distinguished Name prompt (for the private key), then the desired private key password.
Generate CSR For Existing Private Key
Use this method if you want to generate an CSR that you can send to a CA to request the issuance of a CA-signed SSL certificate. It requires that the keystore and alias already exist; you can use the previous command to ensure this.
This command creates a CSR (domain.csr
) signed by the private key identified by the alias (domain
) in the (keystore.jks
) keystore:
Generate Key Code
After entering the keystore’s password, the CSR will be generated.
Import Signed/Root/Intermediate Certificate
Use this method if you want to import a signed certificate, e.g. a certificate signed by a CA, into your keystore; it must match the private key that exists in the specified alias. You may also use this same command to import root or intermediate certificates that your CA may require to complete a chain of trust. Simply specify a unique alias, such as root
instead of domain
, and the certificate that you want to import.
This command imports the certificate (domain.crt
) into the keystore (keystore.jks
), under the specified alias (domain
). If you are importing a signed certificate, it must correspond to the private key in the specified alias:
You will be prompted for the keystore password, then for a confirmation of the import action.
Note: You may also use the command to import a CA’s certificates into your Java truststore, which is typically located in $JAVA_HOME/jre/lib/security/cacerts
assuming $JAVA_HOME
is where your JRE or JDK is installed.
Generate Self-Signed Certificate in New/Existing Keystore
Use this command if you want to generate a self-signed certificate for your Java applications. This is actually the same command that is used to create a new key pair, but with the validity lifetime specified in days.
Java Generate Key From Password Key
This command generates a 2048-bit RSA key pair, valid for 365
days, under the specified alias (domain
), in the specified keystore file (keystore.jks
):
If the specified keystore does not already exist, it will be created after the requested information is supplied. This will prompt for the keystore password (new or existing), followed by a Distinguished Name prompt (for the private key), then the desired private key password.
Viewing Keystore Entries
This section covers listing the contents of a Java Keystore, such as viewing certificate information or exporting certificates.
List Keystore Certificate Fingerprints
This command lists the SHA fingerprints of all of the certificates in the keystore (keystore.jks
), under their respective aliases:
You will be prompted for the keystore’s password. You may also restrict the output to a specific alias by using the -alias domain
option, where “domain” is the alias name.
List Verbose Keystore Contents
This command lists verbose information about the entries a keystore (keystore.jks
) contains, including certificate chain length, fingerprint of certificates in the chain, distinguished names, serial number, and creation/expiration date, under their respective aliases:
You will be prompted for the keystore’s password. You may also restrict the output to a specific alias by using the -alias domain
option, where “domain” is the alias name.
Note: You may also use this command to view which certificates are in your Java truststore, which is typically located in $JAVA_HOME/jre/lib/security/cacerts
assuming $JAVA_HOME
is where your JRE or JDK is installed.
Use Keytool to View Certificate Information
Java Generate Key From Password Windows 10
This command prints verbose information about a certificate file (certificate.crt
), including its fingerprints, distinguished name of owner and issuer, and the time period of its validity:
You will be prompted for the keystore password.
Export Certificate
This command exports a binary DER-encoded certificate (domain.der
), that is associated with the alias (domain
), in the keystore (keystore.jks
):
You will be prompted for the keystore password. If you want to convert the DER-encoded certificate to PEM-encoding, follow our OpenSSL cheat sheet.
Modifying Keystore
This section covers the modification of Java Keystore entries, such as deleting or renaming aliases.
Change Keystore Password
/generate-ssh-key-terminal-ubuntu.html. This command is used to change the password of a keystore (keystore.jks
):
You will be prompted for the current password, then the new password. You may also specify the new password in the command by using the -new newpass
option, where “newpass” is the password.
Delete Alias
This command is used to delete an alias (domain
) in a keystore (keystore.jks
):
You will be prompted for the keystore password.
Rename Alias
This command will rename the alias (domain
) to the destination alias (newdomain
) in the keystore (keystore.jks
):
You will be prompted for the keystore password.
Conclusion
That should cover how most people use Java Keytool to manipulate their Java Keystores. It has many other uses that were not covered here, so feel free to ask or suggest other uses in the comments.
This tutorial is based on the version of keystore that ships with Java 1.7.0 update 65. For help installing Java on Ubuntu, follow this guide.
The KeyPairGenerator class is used to generate pairs of public and private keys. Key pair generators are constructed using thegetInstance
factory methods (static methods that return instances of a given class). A Key pair generator for a particular algorithm creates a public/private key pair that can be used with this algorithm. It also associates algorithm-specific parameters with each of the generated keys.
There are two ways to generate a key pair: in an algorithm-independent manner, and in an algorithm-specific manner. The only difference between the two is the initialization of the object:
- Algorithm-Independent Initialization
All key pair generators share the concepts of a keysize and a source of randomness. The keysize is interpreted differently for different algorithms (e.g., in the case of the DSA algorithm, the keysize corresponds to the length of the modulus). There is an
initialize
method in this KeyPairGenerator class that takes these two universally shared types of arguments. There is also one that takes just akeysize
argument, and uses theSecureRandom
implementation of the highest-priority installed provider as the source of randomness. (If none of the installed providers supply an implementation ofSecureRandom
, a system-provided source of randomness is used.)Since no other parameters are specified when you call the above algorithm-independent
initialize
methods, it is up to the provider what to do about the algorithm-specific parameters (if any) to be associated with each of the keys.If the algorithm is the DSA algorithm, and the keysize (modulus size) is 512, 768, or 1024, then the Sun provider uses a set of precomputed values for the
p
,q
, andg
parameters. If the modulus size is not one of the above values, the Sun provider creates a new set of parameters. Other providers might have precomputed parameter sets for more than just the three modulus sizes mentioned above. Still others might not have a list of precomputed parameters at all and instead always create new parameter sets. - Algorithm-Specific Initialization
For situations where a set of algorithm-specific parameters already exists (e.g., so-called community parameters in DSA), there are two
initialize
methods that have anAlgorithmParameterSpec
argument. One also has aSecureRandom
argument, while the the other uses theSecureRandom
implementation of the highest-priority installed provider as the source of randomness. (If none of the installed providers supply an implementation ofSecureRandom
, a system-provided source of randomness is used.)
In case the client does not explicitly initialize the KeyPairGenerator (via a call to an initialize
method), each provider must supply (and document) a default initialization. For example, the Sun provider uses a default modulus size (keysize) of 1024 bits.
Note that this class is abstract and extends from KeyPairGeneratorSpi
for historical reasons. Application developers should only take notice of the methods defined in this KeyPairGenerator
class; all the methods in the superclass are intended for cryptographic service providers who wish to supply their own implementations of key pair generators.
Every implementation of the Java platform is required to support the following standard KeyPairGenerator
algorithms and keysizes in parentheses:
DiffieHellman
(1024)DSA
(1024)RSA
(1024, 2048)