MessageDigest

Java的摘要算法在java.security包下MessageDigest,通过SPI加载更多的摘要算法,这个包还提供了一些Java的权限检查,这里提一下摘要算法,用可以配合Base64或者Hex转化组合进行加密。
可以有MD2、MD5、SHA-224、SHA-256、SHA-384、SHA-512等等

例子

/**
 * Java的摘要算法
 *
 * @author unclezs
 * @since 2020/12/19 14:48
 */
@Slf4j
public class MessageDigestSample {
  /**
   * 常用的摘要算法
   */
  public static final String DIGEST_MD2 = "MD2";
  public static final String DIGEST_MD5 = "MD5";
  public static final String DIGEST_SHA = "SHA";
  public static final String DIGEST_SHA_224 = "SHA-224";
  public static final String DIGEST_SHA_256 = "SHA-256";
  public static final String DIGEST_SHA_384 = "SHA-384";
  public static final String DIGEST_SHA_512 = "SHA-512";

  public static void main(String[] args) {
    String[] algorithms =
        {DIGEST_MD2, DIGEST_MD5, DIGEST_SHA, DIGEST_SHA_224, DIGEST_SHA_256, DIGEST_SHA_384, DIGEST_SHA_512};
    for (String algorithm : algorithms) {
      try {
        String original = "original";
        String salt = "salt";
        MessageDigest digest = MessageDigest.getInstance(algorithm);
        digest.reset();
        digest.update(salt.getBytes(StandardCharsets.UTF_8));
        byte[] hashed = digest.digest(original.getBytes());
        log.info("{}生成的摘要:{}", algorithm, Arrays.toString(hashed));
      } catch (NoSuchAlgorithmException e) {
        log.error("摘要算法不存在:{}", algorithm, e);
      }
    }
  }
}

输出

HMac

HMAC(Hash-based Message Authentication Code,散列消息认证码)是一种使用密码散列函数,同时结合一个加密密钥,通过特别计算方式之后产生的消息认证码(MAC)。它可以用来保证数据的完整性,同时可以用来作某个消息的身份验证。
HMAC算法 是一种基于密钥的报文完整性的验证方法。HMAC算法利用哈希运算,以一个密钥和一个消息为输入,生成一个消息摘要作为输出。其安全性是建立在Hash加密算法基础上的。它要求通信双方共享密钥、约定算法、对报文进行Hash运算,形成固定长度的认证码。通信双方通过认证码的校验来确定报文的合法性。HMAC算法可以用来作加密、数字签名、报文验证等。

在javax.crypto包下提供了实现

示例

/**
 * HmacSha256算法加密
 * https://blog.csdn.net/sdnyqfyqf/article/details/105534376
 *
 * @author unclezs
 * @since 2020/12/19 16:33
 */
@Slf4j
public class HmacSample {
  public static void main(String[] args) {
    log.info("HmacSHA256 加密后:{}",byHmacSha256("salt", "unclezs"));
  }

  private static byte[] byHmacSha256(String salt, String original) {
    String hmacSha256 = "HmacSHA256";
    try {
      Mac mac = Mac.getInstance(hmacSha256);
      SecretKey key = new SecretKeySpec(salt.getBytes(StandardCharsets.UTF_8), hmacSha256);
      mac.init(key);
      return mac.doFinal(original.getBytes(StandardCharsets.UTF_8));
    } catch (NoSuchAlgorithmException e) {
      log.error("加密算法不存在:{}", hmacSha256, e);
    } catch (InvalidKeyException e) {
      log.error("非法私有key:{}", hmacSha256, e);
    }
    return new byte[0];
  }
}
2020-12-19 16:45:20 [main] INFO  com.unclezs.samples.java.encryption.HmacSample #main:23 - HmacSHA256 加密后:[3, 40, -93, -87, 70, 63, 79, 86, 31, 59, -1, -67, 115, -26, 76, -46, 31, 4, 35, -119, -112, -82, 43, -27, 97, -12, 76, 63, 115, -113, 41, 109]

评论

博客
分类
标签
归档
关于