zoukankan      html  css  js  c++  java
  • android -------- SHA 加密算法

    安全散列算法(英语:Secure Hash Algorithm,缩写为SHA)是一个密码散列函数家族,是FIPS所认证的安全散列算法。能计算出一个数字消息所对应到的,长度固定的字符串(又称消息摘要)的算法。且若输入的消息不同,它们对应到不同字符串的机率很高。


    SHA家族的五个算法,分别是SHA-1、SHA-224、SHA-256、SHA-384,和SHA-512,由美国国家安全局(NSA)所设计,并由美国国家标准与技术研究院(NIST)发布;是美国的政府标准。后四者有时并称为SHA-2。SHA-1在许多安全协定中广为使用,包括TLS和SSL、PGP、SSH、S/MIME和IPsec,曾被视为是MD5(更早之前被广为使用的杂凑函数)的后继者。但SHA-1的安全性如今被密码学家严重质疑;虽然至今尚未出现对SHA-2有效的攻击,它的算法跟SHA-1基本上仍然相似;因此有些人开始发展其他替代的杂凑算法。


    在网上也是多种多样的,分享仅参考

    import java.security.MessageDigest;
    import java.security.NoSuchAlgorithmException;
    
    public class SHA {
    
        private static final String[] hexDigits = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f" };
        //----------------------------------模式1--------------------------------------------
        private static String getFormattedText(byte[] bytes) {
            int len = bytes.length;
            StringBuilder buf = new StringBuilder(len * 2);
            // 把密文转换成十六进制的字符串形式
            for (int j = 0; j < len; j++) {
                buf.append(hexDigits[(bytes[j] >> 4) & 0x0f]);
                buf.append(hexDigits[bytes[j] & 0x0f]);
            }
            return buf.toString();
        }
    
        public static String encode(String str) {
            if (str == null) {
                return null;
            }
            try {
                MessageDigest messageDigest = MessageDigest.getInstance("SHA1");
                messageDigest.update(str.getBytes());
                return getFormattedText(messageDigest.digest());
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }
    
        /*---------------------------------------模式2--------------------------------------------*/
    
        /**
         * @Comment SHA1实现
         * @Author Ron
         * @Date 2017年9月13日 下午3:30:36
         * @return
         */
        public static String shaEncode(String inStr) throws Exception {
            MessageDigest sha = null;
            try {
                sha = MessageDigest.getInstance("SHA");
            } catch (Exception e) {
                System.out.println(e.toString());
                e.printStackTrace();
                return "";
            }
    
            byte[] byteArray = inStr.getBytes("UTF-8");
            byte[] md5Bytes = sha.digest(byteArray);
            StringBuffer hexValue = new StringBuffer();
            for (int i = 0; i < md5Bytes.length; i++) {
                int val = ((int) md5Bytes[i]) & 0xff;
                if (val < 16) {
                    hexValue.append("0");
                }
                hexValue.append(Integer.toHexString(val));
            }
            return hexValue.toString();
        }
    
        /*---------------------------------------------------SHA256-------------------------------------------------------------*/
    
        /**
         * SHA加密
         *
         * @param strSrc
         *            明文
         * @return 加密之后的密文
         */
        public static String shaEnc256(String strSrc) {
            MessageDigest md = null;
            String strDes = null;
            byte[] bt = strSrc.getBytes();
            try {
                md = MessageDigest.getInstance("SHA-256");// 将此换成SHA-1、SHA-512、SHA-384等参数
                md.update(bt);
                strDes = bytes2Hex(md.digest()); // to HexString
            } catch (NoSuchAlgorithmException e) {
                return null;
            }
            return strDes;
        }
    
        /**
         * byte数组转换为16进制字符串
         *
         * @param bts
         *            数据源
         * @return 16进制字符串
         */
        public static String bytes2Hex(byte[] bts) {
            String des = "";
            String tmp = null;
            for (int i = 0; i < bts.length; i++) {
                tmp = (Integer.toHexString(bts[i] & 0xFF));
                if (tmp.length() == 1) {
                    des += "0";
                }
                des += tmp;
            }
            return des;
        }
    
    
    
        /**
         * SHA加密
         *
         * @param strSrc
         *            明文
         * @return 加密之后的密文
         */
        public static String shaEnc512(String strSrc) {
            MessageDigest md = null;
            String strDes = null;
            byte[] bt = strSrc.getBytes();
            try {
                md = MessageDigest.getInstance("SHA-512");// 将此换成SHA-1、SHA-512、SHA-384等参数
                md.update(bt);
                strDes = bytes2Hex(md.digest()); // to HexString
            } catch (NoSuchAlgorithmException e) {
                return null;
            }
            return strDes;
        }
    
    
        public static void main(String args[]) throws Exception {
            //String str = new String("123456789 Hello 小笨蛋");
    
            String str = "123456789 Hello 小笨蛋";
    
            System.out.println("原始:" + str);
            System.out.println("SHA模式1:" + encode(str));
    
            String a = shaEncode(str);
            System.out.println("SHA模式2:"+a);
            System.out.println("长度:"+a.length());//40
    
    
            String b = shaEnc256(str);
            System.out.println(b);
            System.out.println("长度:"+b.length());//64
    
            String c = shaEnc512(str);
            System.out.println(c);
            System.out.println("长度:"+c.length());//128
    
        }
    }

    日志:

  • 相关阅读:
    GXPT(一)——UI设计
    JVM系列文章(四):类载入机制
    poj 2688 状态压缩dp解tsp
    ASP.NET MVC Model绑定(四)
    cocos2dx实例开发之flappybird(入门版)
    qt creator中使用qwt插件
    [CodeEdit--Sublime]一些好用的Plugins
    NBUT 1225 NEW RDSP MODE I
    [IOC]Unity使用
    [Js/Jquery]jquery插件开发
  • 原文地址:https://www.cnblogs.com/zhangqie/p/10980263.html
Copyright © 2011-2022 走看看