Что делает метод обновления MessageDigest и для чего предназначен BASE64Encoder?

Ниже приведен код, который будет шифровать строку пользователя:

import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import sun.misc.BASE64Encoder;
import java.io.*;

class Encrypter {
public synchronized String encrypt(String plainText) throws Exception {
    MessageDigest md = null;
    try {
        md = MessageDigest.getInstance("SHA");
    }catch(Exception exc) {
        throw new Exception(exc.getMessage());
     }

     try {
        md.update(plainText.getBytes("UTF-8"));
     }catch(Exception exc) {
        throw new Exception(exc.getMessage());
      }

      byte raw[] = md.digest();
      String hash = (new BASE64Encoder()).encode(raw);
      return hash;
}
public static void main(String args[]) {
    try {
        Encrypter encrypter = new Encrypter();
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String userInput = br.readLine();
        String encryptedPassword = encrypter.encrypt(userInput);
        System.out.println(encryptedPassword);
    } catch(Exception exc) {
        System.out.println(exc);
      }
}
}

когда я компилирую код, я получаю эти предупреждения:

Encrypter.java:4: warning: BASE64Encoder is internal proprietary API and may be removed in a future release
import sun.misc.BASE64Encoder;
           ^
Encrypter.java:23: warning: BASE64Encoder is internal proprietary API and may be removed in a future release
              String hash = (new BASE64Encoder()).encode(raw);
                                 ^
2 warnings

есть ли другой метод шифрования строк в java ?

что делает метод update класса MessageDigest делать ? я.е какое заявление md.update(plainText.getBytes("UTF-8")); делать ?

что это BASE64Encoder класса ? Я не мог найти это DOC

4 ответов


  1. прежде всего, вы не выполняете никакого шифрования. Вы вычисляете односторонний хэш или дайджест вашего ввода. Этот хэш можно позже использовать для проверки целостности сообщения. См.хеширования, в SHA1 и MessageDigest.

  2. кодировка Base64 - это метод представления двоичных данных в ASCII. Это часто желательно, поскольку не все механизмы хранения и передачи данных поддержка raw binary. Например, если вы хотите перенести вычисленный дайджест через параметр строки http-запроса, вы захотите кодировать его как Base64. Кроме того, сохранение или печать RAW-двоичного файла на консоль приведет к потоку фанковых символов, которые могут находиться за пределами диапазона печати, а также могут издавать звуковые сигналы от динамика вашего ПК!

  3. The Base64Encoder вы используете происходит от sun.misc пакет и никогда не должен использоваться. Это внутренний код Sun JVM, который может или может быть недоступна в будущем. Это также объясняет, почему вы не смогли найти javadoc.

  4. к счастью, существует несколько свободных и открытых кодеров и декодеров Base64. Кодек Apache Commons - это широко используемая и стабильная библиотека, которая содержит несколько кодеков, включая в base64.

  5. md.update(plainText.getBytes("UTF-8")) обновляет входные данные дайджеста. Зову digest выполняет окончательное обновление и вычисляет дайджест вход. См. javadoc из md.digest и md.update



в то время как старый пост здесь-обновленный ответ. В base64 на Java 8 по.

Java 8 Base64 Документы


для шифрования и дешифрования Base64 это предупреждение ясно говорит о том, что оно не поощряет использование реализации Sun Base64Encoder и дает предупреждение о том, что реализация может быть удалена в будущих выпусках, что мы можем сделать, это переключиться на другую реализацию кодера Base64. Мы можем использовать библиотека кодеков Commons для base64 энкодер. Ниже приведен пример:

1. Add Commons Codec library in classpath of your project
2. Add import statement for Base64 Class.

import org.apache.commons.codec.binary.Base64;

3. Encrypt your data

String testString = "Hello World";
byte[] encodedBytes = Base64.encodeBase64(testString.getBytes());
// Get encoded string
String encodedString = new String(encodedBytes);
// Get decoded string back
String decodedString = new String(Base64.decodeBase64(encodedBytes));

после использования библиотеки кодеков Commons вы не должны видеть выше предупреждение снова.