zoukankan      html  css  js  c++  java
  • Java语言实现 Base64 加密 & 解密

    Java语言实现 Base64 加密 & 解密


    Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法。

    Base64编码是从二进制到字符的过程,可用于在HTTP环境下传递较长的标识信息。

    采用Base64编码具有不可读性,需要解码后才能阅读。

    Base64由于以上优点被广泛应用于计算机的各个领域。

    本文讲解如何使用Java语言实现Base64的加密和解密。(基于 JDK 1.8 的新增功能 Base64 特性


     

    初始版本

    代码如下:

    import java.io.UnsupportedEncodingException;
    import java.util.Base64;
    
    /**
     * @author Miracle Luna
     * @version 1.0
     * @date 2019/7/3 18:55
     */
    public class Base64Converter {
    
        final static Base64.Encoder encoder = Base64.getEncoder();
        final static Base64.Decoder decoder = Base64.getDecoder();
    
        /**
         * 给字符串加密
         * @param text
         * @return
         */
        public static String encode(String text) {
            byte[] textByte = new byte[0];
            try {
                textByte = text.getBytes("UTF-8");
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
            String encodedText = encoder.encodeToString(textByte);
            return encodedText;
        }
    
        /**
         * 将加密后的字符串进行解密
         * @param encodedText
         * @return
         */
        public static String decode(String encodedText) {
            String text = null;
            try {
                text = new String(decoder.decode(encodedText), "UTF-8");
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
            return text;
        }
    
        public static void main(String[] args) throws UnsupportedEncodingException {
    
            String username = "Miracle Luna";
            String password = "p@sSW0rd";
    
            // 加密
            System.out.println("====  [加密后] 用户名/密码  =====");
            System.out.println(Base64Converter.encode(username));
            System.out.println(Base64Converter.encode(password));
    
            // 解密
            System.out.println("
    ====  [解密后] 用户名/密码  =====");
            System.out.println(Base64Converter.decode(Base64Converter.encode(username)));
            System.out.println(Base64Converter.decode(Base64Converter.encode(password)));
        }
    }

    运行结果如下:

    ====  [加密后] 用户名/密码  =====
    TWlyYWNsZSBMdW5h
    cEBzU1cwcmQ=
    
    ====  [解密后] 用户名/密码  =====
    Miracle Luna
    p@sSW0rd

     

    改进版本(推荐

    代码如下:

    import java.nio.charset.StandardCharsets;
    import java.util.Base64;
    
    /**
     * @author Miracle Luna
     * @version 1.0
     * @date 2019/7/3 18:55
     */
    public class Base64Util {
    
        final static Base64.Encoder encoder = Base64.getEncoder();
        final static Base64.Decoder decoder = Base64.getDecoder();
    
        /**
         * 给字符串加密
         * @param text
         * @return
         */
        public static String encode(String text) {
    //        byte[] textByte = text.getBytes(StandardCharsets.UTF_8);
    //        String encodedText = encoder.encodeToString(textByte);
    //        return encodedText;
            return encoder.encodeToString(text.getBytes(StandardCharsets.UTF_8));
        }
    
        /**
         * 将加密后的字符串进行解密
         * @param encodedText
         * @return
         */
        public static String decode(String encodedText) {
            return new String(decoder.decode(encodedText), StandardCharsets.UTF_8);
        }
    
        public static void main(String[] args) {
    
            String username = "Miracle Luna";
            String password = "p@sSW0rd";
    
            // 加密
            System.out.println("====  [加密后] 用户名/密码  =====");
            System.out.println(Base64Util.encode(username));
            System.out.println(Base64Util.encode(password));
    
            // 解密
            System.out.println("
    ====  [解密后] 用户名/密码  =====");
            System.out.println(Base64Util.decode(Base64Util.encode(username)));
            System.out.println(Base64Util.decode(Base64Util.encode(password)));
        }
    }

    运行结果如下:

    ====  [加密后] 用户名/密码  =====
    TWlyYWNsZSBMdW5h
    cEBzU1cwcmQ=
    
    ====  [解密后] 用户名/密码  =====
    Miracle Luna
    p@sSW0rd

     

    PS:

    改进版本使用了 StandardCharsets.UTF_8 代替了 "UTF-8"

    所以,没有抛出初始版本的 UnsupportedEncodingException 异常。

    StandardCharsets.java 源码如下:

    /*
     * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
     * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
     *
     *
     *
     *
     *
     *
     *
     *
     *
     *
     *
     *
     *
     *
     *
     *
     *
     *
     *
     *
     */
    package java.nio.charset;
    
    /**
     * Constant definitions for the standard {@link Charset Charsets}. These
     * charsets are guaranteed to be available on every implementation of the Java
     * platform.
     *
     * @see <a href="Charset#standard">Standard Charsets</a>
     * @since 1.7
     */
    public final class StandardCharsets {
    
        private StandardCharsets() {
            throw new AssertionError("No java.nio.charset.StandardCharsets instances for you!");
        }
        /**
         * Seven-bit ASCII, a.k.a. ISO646-US, a.k.a. the Basic Latin block of the
         * Unicode character set
         */
        public static final Charset US_ASCII = Charset.forName("US-ASCII");
        /**
         * ISO Latin Alphabet No. 1, a.k.a. ISO-LATIN-1
         */
        public static final Charset ISO_8859_1 = Charset.forName("ISO-8859-1");
        /**
         * Eight-bit UCS Transformation Format
         */
        public static final Charset UTF_8 = Charset.forName("UTF-8");
        /**
         * Sixteen-bit UCS Transformation Format, big-endian byte order
         */
        public static final Charset UTF_16BE = Charset.forName("UTF-16BE");
        /**
         * Sixteen-bit UCS Transformation Format, little-endian byte order
         */
        public static final Charset UTF_16LE = Charset.forName("UTF-16LE");
        /**
         * Sixteen-bit UCS Transformation Format, byte order identified by an
         * optional byte-order mark
         */
        public static final Charset UTF_16 = Charset.forName("UTF-16");
    }

    推荐一个在线 Base64 加密&解密的网页:https://base64.supfree.net/

    对 p@sSW0rd 进行加密,效果如下:

    加密前:

    加密后:

  • 相关阅读:
    用户控件赋值
    计算一串数字中每个数字出现的次数
    如何理解c和c++的复杂类型声明
    STM32 NVIC学习
    stm32f10x_flash.c中文版
    IBM中国研究院Offer之感言——能力是一种态度
    对于STM32别名区的理解 (转载)
    STM32时钟学习之STM3210X_RCC.H解读
    STM32 DMA
    STM32 内部时钟输出PA.8(MCO)
  • 原文地址:https://www.cnblogs.com/miracle-luna/p/11128734.html
Copyright © 2011-2022 走看看