java.security.NoSuchAlgorithmException: PBKDF2WithHmacSHA512 SecretKeyFactory недоступен Android [duplicate]

Вы можете сделать это с помощью функции reshape() или с функциями melt() / cast() в пакете reshape. Для второго варианта пример кода:

library(reshape)
cast(dat1, name ~ numbers)

Или с помощью reshape2

library(reshape2)
dcast(dat1, name ~ numbers)
5
задан Qwerky 6 December 2011 в 11:54
поделиться

3 ответа

Не все версии Java предоставляют SecretKeyFactory для «AES» у своих поставщиков по умолчанию.

Если вы хотите сгенерировать новый ключ, выберите нужное количество бит (128, 192 или 256) из экземпляра SecureRandom и использовать это случайное число для инициализации экземпляра SecretKeySpec.

Если вы используете шифрование на основе пароля, создайте SecretKeyFactory для алгоритма «PBKDF2WithHmacSHA1», и использовать его для инициализации экземпляра SecretKeySpec как , показанного здесь.

2
ответ дан Community 22 August 2018 в 13:18
поделиться
  • 1
    Будьте внимательны в отношении этой комбинации - большая ошибка в Android, зафиксированная в 4.4, означает, что pre & amp; сообщение 4.4 дает разные результаты. [Д0] android-developers.blogspot.ca/2013/12/… – Tom 13 December 2013 в 20:45
  • 2
    Не будьте осторожны с PBKDF2WithHmacSHA1; это алгоритм, который вы должны использовать, и расшифровывает сообщения, зашифрованные с помощью SunJCE. Если вам нужно работать с данными, которые были зашифрованы с использованием старой, багги-версии Android, тогда вам нужно будет знать нестандартный 8-битный алгоритм. Если вы используете SunJCE для дешифрования сообщений, зашифрованных с помощью баггских реализаций Android, вам нужно будет установить верхние 8 бит каждого char в пароле нуль самостоятельно, так как он не предоставляет алгоритм с таким поведением. – erickson 13 December 2013 в 21:11
  • 3
    Я не сказал, что не использую его - я просто сказал, чтобы заботиться, и поскольку есть проблема с Android (и BouncyCastle тоже, я считаю), я не думаю, что это необоснованно. – Tom 16 December 2013 в 21:12
  • 4
    В этом есть смысл. Я подчеркиваю этот момент, потому что главный ответ имеет ужасный недостаток безопасности, просто используя хеш-функцию для вывода ключа. – erickson 16 December 2013 в 21:15

Это проверенная ошибка Java. См. http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7022467

EDIT: разные версии Java поддерживают разные алгоритмы, вы также можете расширить их с помощью пользовательских провайдеров и так далее. Oracle имеет список для java 6 здесь http://docs.oracle.com/javase/6/docs/technotes/guides/security/SunProviders.html . Для KeyFactory это DSA.

5
ответ дан jontro 22 August 2018 в 13:18
поделиться
  • 1
    Я получаю то же исключение для почти всех алгоритмов из списка (работает только DES). – yegor256 6 December 2011 в 10:44

Вам действительно не нужно использовать SecretKeyFactory. Вы можете создать ключ AES со следующим:

byte[] keyData = ........ 
SecretKeySpec key = new SecretKeySpec(keyData, "AES");

Если вы хотите сделать шифрование на основе пароля (PBE), просто выберите безопасный алгоритм хеширования, который даст вам хэш того же размера, что и требуемый ключ , Например, если вы хотите использовать 256-битный ключ для AES, вот способ построения ключа:

private Key buildKey(String password) throws NoSuchAlgorithmException, UnsupportedEncodingException {
  MessageDigest digester = MessageDigest.getInstance("SHA-256");
  digester.update(password.getBytes("UTF-8"));
  byte[] key = digester.digest();
  SecretKeySpec spec = new SecretKeySpec(key, "AES");
  return spec;
}

Редактировать: я бы рекомендовал не использовать MD5 и DES, если это не игровой проект, оба имеют недостатки и считаются устаревшими.

4
ответ дан Qwerky 22 August 2018 в 13:18
поделиться
  • 1
    Простое хеширование пароля не является безопасным способом получения пароля. Используйте алгоритм распознавания ключа (также предоставленный JCA) для преобразования текста в секретный ключ. – erickson 2 June 2012 в 01:03
  • 2
    @erickson Но окончательная «оценка» соответствующего вопроса (связанная в ответе ниже) предлагает мне, что вышеупомянутое решение является рекомендуемым решением для AES. Как мы могли бы улучшить вышеупомянутое решение, не возвращаясь к SecretKeyFactory, который не собирается поддерживать AES. – Tom 16 March 2013 в 19:33
  • 3
    @tom. Окончательная оценка не предполагает использование одного раунда хэширования для выполнения шифрования на основе пароля. Пожалуйста, см. Мой ответ , чтобы безопасно следовать указаниям оценки. – erickson 16 March 2013 в 22:47
Другие вопросы по тегам:

Похожие вопросы: