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 } }
日志: