Как я могу вернуть пароль, который я сохранил в хранилище ключей JCEKS? - PullRequest
1 голос
/ 12 апреля 2020

Я создал хранилище ключей, используя java keytool для хранения пароля, используя следующую команду

$ keytool -importpassword -alias myalias -keystore mykeystore.jceks -storetype jceks 
Enter keystore password:  keystore
Re-enter new password: keystore
Enter the password to be stored: testpassword 
Re-enter password: testpassword
Enter key password for <myalias>
    (RETURN if same as keystore password): 

Я хочу получить этот пароль в программе java. Вот что я написал до сих пор.

InputStream is = new FileInputStream(new File("mykeystore.jceks"));
KeyStore ks = KeyStore.getInstance("jceks");
ks.load(is, "keystore".toCharArray());
PasswordProtection pp = new PasswordProtection("keystore".toCharArray());
SecretKeyEntry ske = (SecretKeyEntry) ks.getEntry("myalias", pp);
System.out.println(ske.toString()); // Outputs: "Secret key entry with algorithm PBEWithMD5AndDES"

Как мне вернуть пароль, который я храню? Возможно ли это?

Полный код ссылки ниже.

Обязательные библиотеки:

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;

import java.security.Key;
import java.security.KeyStore;
import java.security.KeyStore.PasswordProtection;
import java.security.KeyStore.SecretKeyEntry;

import java.security.cert.CertificateException;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.UnrecoverableKeyException;
import java.security.UnrecoverableEntryException;

Класс:

class JCEKS 
{  
    public static void main(String args[]) 
    {
        try{
            InputStream is = new FileInputStream(new File("mykeystore.jceks"));
            KeyStore ks = KeyStore.getInstance("jceks");
            ks.load(is, "keystore".toCharArray());
            PasswordProtection pp = new PasswordProtection("keystore".toCharArray());
            SecretKeyEntry ske = (SecretKeyEntry) ks.getEntry("myalias", pp);

            System.out.println(ske.toString());
        }
        catch(KeyStoreException e){
            System.out.println("KeyStoreException:");
            System.out.println(e);
        }
        catch(FileNotFoundException e){
            System.out.println("FileNotFoundException:");
            System.out.println(e.getMessage());
        }
        catch(IOException e){
            System.out.println("IOException:");
            System.out.println(e.getMessage());
        }
        catch(NoSuchAlgorithmException e){
            System.out.println("NoSuchAlgorithmException:");
            System.out.println(e.getMessage());
        }
        catch(CertificateException e){
            System.out.println("CertificateException:");
            System.out.println(e.getMessage());
        }
        catch(UnrecoverableKeyException e){
            System.out.println("UnrecoverableKeyException:");
            System.out.println(e.getMessage());
        }
        catch(UnrecoverableEntryException e){
            System.out.println("UnrecoverableEntryException:");
            System.out.println(e.getMessage());
        }
    } 
} 

Ответы [ 2 ]

1 голос
/ 14 апреля 2020

Сохраненная вами запись password сохраняется как SecretKeyEntry, и ее значение можно получить с помощью метода getEncoded() объекта secretKey.

System.out.println (новая строка (ske.getSecretKey (). getEncoded ()));

0 голосов
/ 18 апреля 2020

После некоторых копаний и проб и ошибок выясняется, что вы МОЖЕТЕ восстановить пароль, который вы храните, используя keytool. Например, если вы используете следующую команду для хранения пароля

    > $ keytool -importpassword -alias my-alias -keystore my-keystore.jcek -storetype jceks

    > Enter keystore password:  keystorepassword 
    > Re-enter new password:keystorepassword 
    > Enter the password to be stored: thepassword
    > Re-enter password: thepassword 
    > Enter key password for <my-alias>
        (RETURN if same as keystore password): keypassword 
    > Re-enter new password: keypassword

Чтобы получить сохраните пароль (то есть 'thepassword'):

InputStream is = new FileInputStream(new File("my-keystore.jceks"));
KeyStore ks = KeyStore.getInstance("JCEKS");
ks.load(is, "keystorepassword".toCharArray());
PasswordProtection pp = new PasswordProtection("keypassword".toCharArray());
SecretKeyEntry ske = (SecretKeyEntry) ks.getEntry("my-alias", pp);
SecretKeyFactory factory = SecretKeyFactory.getInstance("PBEWITHMD5ANDDES");
PBEKeySpec keySpec = (PBEKeySpec) factory.getKeySpec(ske.getSecretKey(), PBEKeySpec.class);
String password = new String(keySpec.getPassword());
System.out.println(password);

Вывод: thepassword

Обратите внимание, что при сохранении строки по умолчанию используется алгоритм PBEWITHMD5ANDDES . Поэтому вам нужно скачать javax-crypto.jar и скомпилировать его вместе с вашей программой javac -cp javax-crypto.jar your-program.java

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...