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中的字符串?

MessageDigest类的方法update有什么作用? 即语句md.update(plainText.getBytes("UTF-8"));是什么md.update(plainText.getBytes("UTF-8")); 做什么?

什么是BASE64Encoder类? 我找不到它的DOC

  1. 首先,您没有执行任何加密。 您正在计算输入的单向散列或摘要。 此哈希稍后可用于validation消息的完整性。 请参阅散列 , SHA1和MessageDigest 。

  2. Base64编码是一种用ASCII表示二进制数据的方法。 这通常是可取的,因为并非所有数据存储和传输机制都支持原始二进制。 例如,如果要通过http查询字符串参数传输计算摘要,则需要将其编码为Base64。 另外,将原始二进制文件保存或打印到控制台会产生一系列时髦字符,这些字符可能超出可打印范围,并且还可能会从PC扬声器发出蜂鸣声!

  3. 你正在使用的Base64Encoder来自sun.misc包,不应该使用。 这是内部Sun JVM代码,将来可能会或可能不会提供。 这也解释了为什么你无法找到任何javadoc。

  4. 幸运的是,存在一些免费且开放的Base64编码器和解码器。 Apache Commons Codec是一个广泛使用且稳定的库,包含多个编解码器,包括Base64 。

  5. md.update(plainText.getBytes("UTF-8"))更新摘要的输入。 调用digest执行最终更新并计算输入的摘要。 请参阅md.digestmd.update javadoc

看看Apache Commons Codec: https : //commons.apache.org/codec/

例如: https : //commons.apache.org/codec/api-release/org/apache/commons/codec/digest/DigestUtils.html

虽然旧post在这里是一个更新的答案。 Java 8的Base64。

Java 8 Base64文档

对于Base64加密和解密,此警告清楚地表明它不鼓励使用Sun实现的Base64Encoder,并发出警告,可能会在将来的版本中删除实现,我们可以做的是切换到Base64编码器的其他实现。 我们可以使用Commons Codec库用于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编解码器库后,您不应再次看到上述警告。