Użyłem KeyPairGenerator
do wygenerowania pary kluczy RSA. Jeśli się nie mylę, KeyStore służy tylko do przechowywania certyfikatów, a nie kluczy. Jak mogę poprawnie zapisać klucz prywatny na komputerze?Jak używać magazynu kluczy w Javie do przechowywania klucza prywatnego?
Odpowiedz
można zrobić coś takiego:
KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
kpg.initialize(2048);
KeyPair kp = kpg.genKeyPair();
KeyFactory fact = KeyFactory.getInstance("RSA");
RSAPublicKeySpec pub = fact.getKeySpec(kp.getPublic(),
RSAPublicKeySpec.class);
saveToFile(PUBLIC_KEY_FILE,
pub.getModulus(), pub.getPublicExponent());
RSAPrivateKeySpec priv = fact.getKeySpec(kp.getPrivate(),
RSAPrivateKeySpec.class);
saveToFile(PRIVATE_KEY_FILE,
priv.getModulus(), priv.getPrivateExponent());
SAVE Funkcja:
private static void saveToFile(String fileName,
BigInteger mod, BigInteger exp)
throws SomeException {
ObjectOutputStream oout = new ObjectOutputStream(
new BufferedOutputStream(new FileOutputStream(fileName)));
try {
oout.writeObject(mod);
oout.writeObject(exp);
} catch (Exception e) {
throw new SomeException(e);
} finally {
oout.close();
}
}
I czytać tę samą drogę powrotną :
private static PublicKey readPublicKey() throws SomeException {
InputStream in = new FileInputStream(PUBLIC_KEY_FILE);
ObjectInputStream oin =
new ObjectInputStream(new BufferedInputStream(in));
try {
BigInteger m = (BigInteger) oin.readObject();
BigInteger e = (BigInteger) oin.readObject();
RSAPublicKeySpec keySpec = new RSAPublicKeySpec(m, e);
KeyFactory fact = KeyFactory.getInstance("RSA");
PublicKey pubKey = fact.generatePublic(keySpec);
return pubKey;
} catch (Exception e) {
throw new SomeException(e);
} finally {
oin.close();
}
}
Czytanie klucza prywatnego jest podobne.
http://snipplr.com/view/18368/
lub
http://docs.oracle.com/javase/1.5.0/docs/api/java/security/KeyStore.html
lub
http://java.sun.com/docs/books/tutorial/security/apisign/vstep2.html Jest to najbardziej obiecujące
lub
Niemożliwe jest zabezpieczenie klucza w niezaufanym środowisku. Możesz zaciemnić swój kod, możesz utworzyć klucz z dowolnych zmiennych, cokolwiek. Ostatecznie, zakładając, że używasz standardowej biblioteki javax.crypto, musisz zadzwonić do Mac.getInstance(), a czasem później nazwiesz init() na tym wystąpieniu. Ktoś, kto chce twój klucz, dostanie to.
Jednak myślę, że rozwiązaniem jest powiązanie klucza z otoczeniem, a nie z programem. Podpis ma na celu stwierdzenie, że dane pochodzą ze znanego źródła i nie zostały zmienione, ponieważ to źródło je dostarczyło. Obecnie próbujesz powiedzieć "gwarancja, że mój program wygenerował dane". Zamiast tego zmień swoje wymagania, aby "zagwarantować, że dany użytkownik mojego programu wygenerował dane". Zobowiązanie zostaje następnie przeniesione na tego użytkownika, aby zajął się swoim kluczem.
W zależności od formatu klucza prywatnego może być konieczne przekonwertowanie go na format, którego może używać keytool Java.
Ale jeśli jest w formacie obsługiwanym przez keytool, powinieneś po prostu zaimportować go za pomocą keytool. Więcej informacji pod adresem:
http://docs.oracle.com/javase/tutorial/security/toolfilex/rstep1.html
http://docs.oracle.com/javase/1.5.0/docs/tooldocs/windows/keytool.html
Ten blok kodu wygeneruje i zapisze KeyPair w AndroidKeyStore. (UWAGA: połowy wyjątków pominięta)
KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore");
keyStore.load(null);
String alias = "my_key"; // replace as required or get it as a function argument
int nBefore = keyStore.size(); // debugging variable to help convince yourself this works
// Create the keys if necessary
if (!keyStore.containsAlias(alias)) {
Calendar notBefore = Calendar.getInstance();
Calendar notAfter = Calendar.getInstance();
notAfter.add(Calendar.YEAR, 1);
KeyPairGeneratorSpec spec = new KeyPairGeneratorSpec.Builder(this)
.setAlias(alias)
.setKeyType("RSA")
.setKeySize(2048)
.setSubject(new X500Principal("CN=test"))
.setSerialNumber(BigInteger.ONE)
.setStartDate(notBefore.getTime())
.setEndDate(notAfter.getTime())
.build();
KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA", "AndroidKeyStore");
generator.initialize(spec);
KeyPair keyPair = generator.generateKeyPair();
}
int nAfter = keyStore.size();
Log.v(TAG, "Before = " + nBefore + " After = " + nAfter);
// Retrieve the keys
KeyStore.PrivateKeyEntry privateKeyEntry = (KeyStore.PrivateKeyEntry)keyStore.getEntry(alias, null);
RSAPrivateKey privateKey = (RSAPrivateKey) privateKeyEntry.getPrivateKey();
RSAPublicKey publicKey = (RSAPublicKey) privateKeyEntry.getCertificate().getPublicKey();
Log.v(TAG, "private key = " + privateKey.toString());
Log.v(TAG, "public key = " + publicKey.toString());
- 1. Jak używać kluczy prywatnych z Android przechowywania
- 2. Java - sposobu przechowywania klucza w magazynie kluczy
- 3. Jak poznać plik .apk używać do magazynu kluczy do podpisania?
- 4. Dodawanie klucza prywatnego do pęku kluczy systemu iOS
- 5. Szyfrowanie za pomocą klucza prywatnego RSA w Javie
- 6. Brakujący deweloper iPhone klucza prywatnego w pęku kluczy
- 7. Zgubione hasło do magazynu kluczy
- 8. Jak dodać łańcuch certyfikatów do magazynu kluczy?
- 9. iOS: Dodawanie klucza prywatnego do urządzeń KeyChain
- 10. Przesyłanie do gita TFS przy użyciu klucza publicznego/prywatnego
- 11. Nieprawidłowy format magazynu kluczy
- 12. programowo zaimportuj certyfikat .cer do magazynu kluczy
- 13. zapisz hasło do magazynu kluczy w Android studio 3
- 14. szyfrowania klucza prywatnego z BouncyCastle
- 15. Udostępnianie magazynu kluczy do klienta usługi WWW
- 16. Najlepsze praktyki dotyczące przechowywania kluczy tajnych
- 17. Skonfiguruj środowisko Eclipse do korzystania ze podpisanego magazynu kluczy
- 18. Tomcat HTTPS certyfikat magazynu kluczy
- 19. Używanie zakodowanego, zaszyfrowanego klucza prywatnego PEM do podpisania wiadomości natywnie
- 20. Importowanie klucza prywatnego do pęku kluczy nie działa zgodnie z oczekiwaniami w telefonie iPhone
- 21. Błąd "Zła wersja magazynu kluczy". Jak mogę utworzyć certyfikat magazynu kluczy version = 1?
- 22. Jak zautomatyzować generowanie magazynu kluczy za pomocą narzędzia magazynu kluczy Java? brak interakcji użytkownika
- 23. alert bezpieczeństwa: App zawiera wbudowane kluczy prywatnych i plików magazynu kluczy
- 24. jak zmienić hasło magazynu kluczy PKCS12 za pomocą keytool?
- 25. Używanie HashTable do przechowywania tylko kluczy?
- 26. Jak zmienić hasło klucza prywatnego za pomocą modułu PHP OpenSSL?
- 27. Szyfrowanie i odszyfrowywanie za pomocą klucza prywatnego w języku Java
- 28. Która domyślna lokalizacja magazynu kluczy/magazynu zaufanych aplikacji Java?
- 29. którego klucza należy użyć do przechowywania hasła w pęku kluczy systemu iOS?
- 30. Znajdź datę wygaśnięcia magazynu kluczy Androida
@segfault, Należy także pamiętać, że trzeba ' ' dodać to w 'AndroidManifest.xml ' –
Israel
Czy bezpiecznie przechowywać klucz prywatny w pamięci dostępnej przez inne aplikacje? (Popraw mnie, jeśli się mylę, ale tak właśnie się stało.) – cph2117
To ty musisz skonfigurować uprawnienia do pliku na poziomie systemu operacyjnego (np. Dedykowany użytkownik dla aplikacji itp.). Niewiarygodne, wykracza to poza zakres tej odpowiedzi. –