java - MessageDigest 的 update 方法有什么作用?BASE64Encoder 的作用是什么?

标签 java encryption cryptography

以下是加密用户字符串的代码:

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

最佳答案

  1. 首先,您没有执行任何加密。您正在计算输入的单向散列或摘要。此散列稍后可用于验证消息的完整性。参见 Hashing , SHA1MessageDigest .

  2. Base64 encoding是一种用 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.digest 的 javadoc和 md.update

关于java - MessageDigest 的 update 方法有什么作用?BASE64Encoder 的作用是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9399400/

相关文章:

java - 具有自定义算法的 Keytool

php - 在 MYSQL 中重现 PHP hash_hmac 功能

java - 如何在数组中存储英文字符而不重复(尝试解决 Play Fair Cypher 加密)? ( java )

encryption - Solr配置,加密数据配置文件

cryptography - 使用 HOTP 生成字母数字 OTP

java - 具有多种颜色和事件的 textView 中的可点击文本

algorithm - 这是哪种密码算法?

java - Java 中的 Runtime.exit(0) 和 System.exit(0) 有什么区别?

java - 从 GWT 调用一些在线服务

java - 如何通过格式化将 double 舍入为两位小数,然后使用该数字?