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
-
首先,您没有执行任何加密。 您正在计算输入的单向散列或摘要。 此哈希稍后可用于validation消息的完整性。 请参阅散列 , SHA1和MessageDigest 。
-
Base64编码是一种用ASCII表示二进制数据的方法。 这通常是可取的,因为并非所有数据存储和传输机制都支持原始二进制。 例如,如果要通过http查询字符串参数传输计算摘要,则需要将其编码为Base64。 另外,将原始二进制文件保存或打印到控制台会产生一系列时髦字符,这些字符可能超出可打印范围,并且还可能会从PC扬声器发出蜂鸣声!
-
你正在使用的
Base64Encoder
来自sun.misc
包,不应该使用。 这是内部Sun JVM代码,将来可能会或可能不会提供。 这也解释了为什么你无法找到任何javadoc。 -
幸运的是,存在一些免费且开放的Base64编码器和解码器。 Apache Commons Codec是一个广泛使用且稳定的库,包含多个编解码器,包括Base64 。
-
md.update(plainText.getBytes("UTF-8"))
更新摘要的输入。 调用digest
执行最终更新并计算输入的摘要。 请参阅md.digest
和md.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编解码器库后,您不应再次看到上述警告。