Что делает метод обновления 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 ответов
прежде всего, вы не выполняете никакого шифрования. Вы вычисляете односторонний хэш или дайджест вашего ввода. Этот хэш можно позже использовать для проверки целостности сообщения. См.хеширования, в SHA1 и MessageDigest.
кодировка Base64 - это метод представления двоичных данных в ASCII. Это часто желательно, поскольку не все механизмы хранения и передачи данных поддержка raw binary. Например, если вы хотите перенести вычисленный дайджест через параметр строки http-запроса, вы захотите кодировать его как Base64. Кроме того, сохранение или печать RAW-двоичного файла на консоль приведет к потоку фанковых символов, которые могут находиться за пределами диапазона печати, а также могут издавать звуковые сигналы от динамика вашего ПК!
The
Base64Encoder
вы используете происходит отsun.misc
пакет и никогда не должен использоваться. Это внутренний код Sun JVM, который может или может быть недоступна в будущем. Это также объясняет, почему вы не смогли найти javadoc.к счастью, существует несколько свободных и открытых кодеров и декодеров Base64. Кодек Apache Commons - это широко используемая и стабильная библиотека, которая содержит несколько кодеков, включая в base64.
md.update(plainText.getBytes("UTF-8"))
обновляет входные данные дайджеста. Зовуdigest
выполняет окончательное обновление и вычисляет дайджест вход. См. javadoc изmd.digest
иmd.update
посмотрите на кодек Apache Commons: https://commons.apache.org/codec/
Е. Г.: https://commons.apache.org/codec/api-release/org/apache/commons/codec/digest/DigestUtils.html
для шифрования и дешифрования 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 вы не должны видеть выше предупреждение снова.