Как вы узнаете, какие криптографические алгоритмы вам доступны? Спецификация Java называет несколько обязательных шифров, дайджестов и т. Д., Но поставщик часто предлагает нечто большее.
К счастью, это легко узнать, что доступно в нашей системе.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
|
public class ListAlgorithms { public static void main(String[] args) { // Security.addProvider(new // org.bouncycastle.jce.provider.BouncyCastleProvider()); // get a list of services and their respective providers. final Map<String, List<Provider>> services = new TreeMap<>(); for (Provider provider : Security.getProviders()) { for (Provider.Service service : provider.getServices()) { if (services.containsKey(service.getType())) { final List<Provider> providers = services.get(service .getType()); if (!providers.contains(provider)) { providers.add(provider); } } else { final List<Provider> providers = new ArrayList<>(); providers.add(provider); services.put(service.getType(), providers); } } } // now get a list of algorithms and their respective providers for (String type : services.keySet()) { final Map<String, List<Provider>> algs = new TreeMap<>(); for (Provider provider : Security.getProviders()) { for (Provider.Service service : provider.getServices()) { if (service.getType().equals(type)) { final String algorithm = service.getAlgorithm(); if (algs.containsKey(algorithm)) { final List<Provider> providers = algs .get(algorithm); if (!providers.contains(provider)) { providers.add(provider); } } else { final List<Provider> providers = new ArrayList<>(); providers.add(provider); algs.put(algorithm, providers); } } } } // write the results to standard out. System.out.printf( "%20s : %s\n" , "" , type); for (String algorithm : algs.keySet()) { System.out.printf( "%-20s : %s\n" , algorithm, Arrays.toString(algs.get(algorithm).toArray())); } System.out.println(); } } } |
Системный администратор может переопределить стандартные криптографические библиотеки. На практике безопаснее всегда загружать собственную криптографическую библиотеку и либо регистрировать ее вручную, как указано выше, либо, что еще лучше, передавать ее в качестве необязательного параметра при создании новых объектов.
Алгоритмы
Есть несколько десятков стандартных алгоритмов. Те, которые нас больше всего интересуют:
Симметричный шифр
- KeyGenerator — создает симметричный ключ
- SecretKeyFactor — конвертирует между симметричными ключами и необработанными байтами
- Шифр — шифрование шифра
- AlgorithmParameters — параметры алгоритма
- AlgorithmParameterGernerator — параметры алгоритма
Асимметричный шифр
- KeyPairGenerator — создает открытые / закрытые ключи
- KeyFactor — конвертирует между парами ключей и необработанными байтами
- Шифр — шифрование шифра
- Подпись — цифровые подписи
- AlgorithmParameters — параметры алгоритма
- AlgorithmParameterGernerator — параметры алгоритма
Дайджесты
- MessageDigest — дайджест (MD5, SHA1 и т. Д.)
- Mac — HMAC. Подобно дайджесту сообщения, но также требует ключ шифрования, поэтому злоумышленник не может его подделать
Сертификаты и хранилища ключей
- KeyStore — JKS , PKCS и др.
- CertStore — как хранилище ключей, но хранит только сертификаты.
- CertificateFactory — конвертирует между цифровыми сертификатами и необработанными байтами.
Важно помнить, что большинство алгоритмов предназначены для обеспечения обратной совместимости и не должны использоваться для разработки новых проектов. Когда я пишу это, общепринятый совет:
- Используйте вариант AES. Используйте AES-ECB только в том случае, если вы абсолютно уверены, что никогда не зашифруете более одного блока данных (16 байт).
- Всегда используйте хороший случайный IV, даже если вы используете AES-CBC. Не используйте тот же IV или легко предсказуемый.
- Не используйте менее 2048 бит в асимметричном ключе.
- Используйте SHA-256 или лучше. MD-5 считается сломанным, SHA-1 будет считаться сломанным в ближайшем будущем.
- Используйте PBKDF2WithHmacSHA1 для создания ключа AES из паролей / парольных фраз. (См. Также Создание ключей шифрования на основе пароля .)
Некоторые люди могут захотеть использовать один из других шифров-кандидатов AES (например, twofish ). Эти шифры, вероятно, безопасны, но вы можете столкнуться с проблемами, если делитесь файлами с другими сторонами, поскольку они не входят в необходимый набор шифров.
Остерегайтесь экспортных ограничений США
Наконец, важно помнить, что стандартный дистрибутив Java ограничен из-за ограничений на экспорт в США. Вы можете получить полную функциональность, установив в вашу систему стандартный файл, предназначенный только для США, но разработчикам трудно, если вообще возможно, проверить, что это было сделано. На практике многие, если не большинство людей используют сторонние криптографические библиотеки, такие как BouncyCastle . Многие неопытные разработчики забывают об этом и непреднамеренно используют ограниченный функционал.
Ссылка: | Получите список доступных криптографических алгоритмов от нашего партнера JCG Бэра Джайлса в блоге Invariant Properties . |