zoukankan      html  css  js  c++  java
  • java 加密解密方式

    1、MD5(Message Digest Algorithm)加密算法

    是一种单向加密算法,只能加密不能解密,示例

    /**
         * MD5简单加密
         * @param content 加密内容
         * @return String
         */
        public static String md5Encrypt(final String content) {
    
            MessageDigest md5 = null;
            try {
                md5 = MessageDigest.getInstance(ALGORITHM_MD5);
            } catch (NoSuchAlgorithmException e) {
                e.printStackTrace();
            }
    //        md5.update(text.getBytes());
            //digest()最后返回md5 hash值,返回值为8位字符串。因为md5 hash值是16位的hex值,实际上就是8位的字符
            //BigInteger函数则将8位的字符串转换成16位hex值,用字符串来表示;得到字符串形式的hash值
            BigInteger digest = new BigInteger(md5.digest(content.getBytes()));
            //32位
            return digest.toString(16);
        }

    2、BASE64进行加密/解密

    通常用作对二进制数据进行加密,示例

    /**
         * base64加密
         * @param content 待加密内容
         * @return byte[]
         */
        public static byte[] base64Encrypt(final String content) {
            return Base64.getEncoder().encode(content.getBytes());
        }
    
        /**
         * base64解密
         * @param encoderContent 已加密内容
         * @return byte[]
         */
        public static byte[] base64Decrypt(final byte[] encoderContent) {
            return Base64.getDecoder().decode(encoderContent);
        }

    3、DES(Data Encryption Standard)对称加密/解密

    数据加密标准算法,和BASE64最明显的区别就是有一个工作密钥,该密钥既用于加密、也用于解密,并且要求密钥是一个长度至少大于8位的字符串,示例

    /**
         * DES加密
         * @param key 秘钥key
         * @param content 待加密内容
         * @return byte[]
         */
        public static byte[] DESEncrypt(final String key, final String content) {
            return processCipher(content.getBytes(), getSecretKey(key), Cipher.ENCRYPT_MODE , ALGORITHM_DES);
        }
    
        /**
         * DES解密
         * @param key 秘钥key
         * @param encoderContent 已加密内容
         * @return byte[]
         */
        public static byte[] DESDecrypt(final String key, final byte[] encoderContent) {
            return processCipher(encoderContent, getSecretKey(key), Cipher.DECRYPT_MODE, ALGORITHM_DES);
        }

    4、RSA非对称加密/解密

    非对称加密算法的典型代表,既能加密、又能解密。和对称加密算法比如DES的明显区别在于用于加密、解密的密钥是不同的。使用RSA算法,只要密钥足够长(一般要求1024bit),加密的信息是不能被破解的。示例

    /**
         * RSA加密
         * @param content 待加密内容
         * @return byte[]
         */
        public static byte[] RSAEncrypt(final String content) {
            return processCipher(content.getBytes(), keyPair.getPrivate(), Cipher.ENCRYPT_MODE , ALGORITHM_RSA);
        }
    
        /**
         * RSA解密
         * @param encoderContent 已加密内容
         * @return byte[]
         */
        public static byte[] RSADecrypt(final byte[] encoderContent) {
            return processCipher(encoderContent, keyPair.getPublic(), Cipher.DECRYPT_MODE, ALGORITHM_RSA);
        }

    5、SHA(Secure Hash Algorithm,安全散列算法)

    数字签名等密码学应用中重要的工具,被广泛地应用于电子商务等信息安全领域,示例

    /**
         * SHA加密
         * @param content 待加密内容
         * @return String
         */
        public static String SHAEncrypt(final String content) {
            try {
                MessageDigest sha = MessageDigest.getInstance(ALGORITHM_SHA);
                byte[] sha_byte = sha.digest(content.getBytes());
                StringBuffer hexValue = new StringBuffer();
                for (byte b : sha_byte) {
                    //将其中的每个字节转成十六进制字符串:byte类型的数据最高位是符号位,通过和0xff进行与操作,转换为int类型的正整数。
                    String toHexString = Integer.toHexString(b & 0xff);
                    hexValue.append(toHexString.length() == 1 ? "0" + toHexString : toHexString);
                }
                return hexValue.toString();
    
    //            StringBuffer hexValue2 = new StringBuffer();
    //            for (int i = 0; i < sha_byte.length; i++) {
    //                int val = ((int) sha_byte[i]) & 0xff;
    //                if (val < 16) {
    //                    hexValue2.append("0");
    //                }
    //                hexValue2.append(Integer.toHexString(val));
    //            }
    //            return hexValue2.toString();
            } catch (Exception e) {
                e.printStackTrace();
            }
           return "";
        }

    6、HMAC(Hash Message Authentication Code,散列消息鉴别码)

    使用一个密钥生成一个固定大小的小数据块,即MAC,并将其加入到消息中,然后传输。接收方利用与发送方共享的密钥进行鉴别认证,示例

    /**
         * HMAC加密
         * @param key 给定秘钥key
         * @param content 待加密内容
         * @return String
         */
        public static byte[] HMACEncrypt(final String key, final String content) {
            try {
                SecretKey secretKey = new SecretKeySpec(key.getBytes(), ALGORITHM_MAC);
                Mac mac = Mac.getInstance(secretKey.getAlgorithm());
                //初始化mac
                mac.init(secretKey);
                return mac.doFinal(content.getBytes());
            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;
        }

    测试代码:

    public static void main(String[] args) {
            //md5简单加密
            String text = "i am text";
            System.out.println(EnDecoderUtil.md5Encrypt(text));
    
            //base64进行加密解密,通常用作对二进制数据进行加密
            byte[] base64Encrypt = EnDecoderUtil.base64Encrypt("123456789");
            String toHexString = HexUtils.toHexString(base64Encrypt);
            System.out.println(toHexString);
            byte[] base64Decrypt = EnDecoderUtil.base64Decrypt(base64Encrypt);
            System.out.println(new String(base64Decrypt));
    
            //DES对称加密/解密
            //要求key至少长度为8个字符
            String key = "123456789";
            //加密
            byte[] encode_bytes = EnDecoderUtil.DESEncrypt(key, "Hello, DES");
            System.out.println(Base64.getEncoder().encodeToString(encode_bytes));
            //解密
            byte[] decode_bytes = EnDecoderUtil.DESDecrypt(key, encode_bytes);
            System.out.println(new String(decode_bytes));
    
            //RSA
            //数据使用私钥加密
            byte[] en_byte = EnDecoderUtil.RSAEncrypt("Hi, RSA");
            System.out.println(Base64.getEncoder().encodeToString(en_byte));
    
            //用户使用公钥解密
            byte[] de_byte = EnDecoderUtil.RSADecrypt(en_byte);
            System.out.println(new String(de_byte));
    
            //服务器根据私钥和加密数据生成数字签名
            byte[] sign_byte = EnDecoderUtil.getSignature(en_byte);
            System.out.println(Base64.getEncoder().encodeToString(sign_byte));
    
            //用户根据公钥、加密数据验证数据是否被修改过
            boolean verify_result = EnDecoderUtil.verifySignature(en_byte, sign_byte);
            System.out.println(verify_result);
    
            //SHA
            String sha = EnDecoderUtil.SHAEncrypt("Hi, RSA");
            System.out.println(sha);
    
            //HMAC
            byte[] mac_bytes = EnDecoderUtil.HMACEncrypt(key, "Hi, HMAC");
            System.out.println(HexUtils.toHexString(mac_bytes));
        }

    源码参照Github

  • 相关阅读:
    composer require 指定版本
    后台管理,有无限可能
    str_replace 批量查找替换字符串
    node项目配置成nginx启动
    nodejs项目安装ant design
    in_array的三个参数
    Tp5.1使用导出Excel
    php 中 public private protected的区别
    Seafile 文件访问日志时间不一致问题
    du -sh *
  • 原文地址:https://www.cnblogs.com/kingsonfu/p/11166037.html
Copyright © 2011-2022 走看看