以下是加密用户字符串的代码:
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 中还有其他加密字符串的方法吗?
类 MessageDigest
的方法 update
有什么作用?即语句 md.update(plainText.getBytes("UTF-8"));
做了什么?
什么是 BASE64Encoder
类?我找不到它的 DOC
最佳答案
首先,您没有执行任何加密。您正在计算输入的单向散列或摘要。此散列稍后可用于验证消息的完整性。参见 Hashing , SHA1和 MessageDigest .
Base64 encoding是一种用 ASCII 表示二进制数据的方法。这通常是可取的,因为并非所有数据存储和传输机制都支持原始二进制文件。例如,如果您想通过 http 查询字符串参数传输您计算出的摘要,您需要将其编码为 Base64。此外,将原始二进制文件保存或打印到控制台会产生一连串奇怪的字符,这些字符可能超出可打印范围,并且还可能从您的 PC 扬声器中发出哔哔声!
您使用的
Base64Encoder
来自sun.misc
包,切勿使用。这是内部 Sun JVM 代码,将来可能会或可能不会提供。这也解释了为什么您找不到任何 javadoc。幸运的是,存在多种免费且开放的 Base64 编码器和解码器。 Apache Commons Codec是一个广泛使用且稳定的库,其中包含多个编解码器,包括 Base64 .
md.update(plainText.getBytes("UTF-8"))
更新摘要的输入。调用digest
执行最终更新并计算输入的摘要。参见md.digest
的 javadoc和md.update
关于java - MessageDigest 的 update 方法有什么作用?BASE64Encoder 的作用是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9399400/