单向加密算法
来源:互联网 发布:javascript库 编辑:程序博客网 时间:2024/05/12 08:37
单向加密算法:
MD5,SHA算法是单向加密算法的代表,单向加密算法是数据完整性验证的常用算法。
对称加密算法:
DES算法是典型的对称加密算法的代表,对称加密算法是数据存储加密的常用算法
非对称算法:
RSA算法是典型的非对称加密算法的代表,非对称加密算法是数据传输加密常用的算法。
对称加密算法也可以用作数据传输加密,但是非对称加密算法在密钥的管理方面更有优势
java API对加密算法的支持
java API支持多种加密算法。如MessageDigest类,可以构建MD5和SHA两种算法。
MAC类可以构建HMAC加密算法,Cipher类也可以构建多种加密算法,
如DES,AES,Blowfish对称加密算法,以及RSA,DSA,DH等多种非对称加密算法,
Signature类可以用于数字签名和签名验证,Certificate类可以用于操作证书等。
非对称密码体制
非对称密码体制的加密密钥和解密密钥不相同,分为两个密钥,一个公开,一个保密。
公开的密钥称为公钥,保密的密钥称为私钥。
Mac 属于消息摘要的一种,但他不同于一般的消息摘要(如MessageDigest提供的消息摘要实现),
仅通过输入数据无法获得消息摘要,必须有一个有发送方和接收方共享的秘密密钥才能生成最终的
消息摘要—安全消息摘要。安全消息摘要也称为消息认证(鉴别)码
(Message Authentication Code, Mac)
Cipher类为加密和解密提供密码功能,它构成了java Cryptographiv Extension(JCE)
框架的核心。
HMAC是密钥相关的哈希运算消息认证码(Hash-based Message Authentication Code),
HMAC运算利用哈希算法,以一个密钥和一个消息为输入,生成一个消息摘要作为输出。
SHA1算法代码具体实现
`
public class SHA1{ public String KEY_SHA = "SHA"; public String INPUTSTRING = "这是要加密的字符串"; @Test public void testSha1() throws Exception { System.out.println("加密之前:\n" + INPUTSTRING); // 将加密的字符串常量转换成字节数组 byte[] inputData = INPUTSTRING.getBytes(); // 验证SHA对于同一内容加密是否一致 assertArrayEquals(encryptSHA(inputData), encryptSHA(inputData)); System.out.println("经过encryptSHA处理后的字符串是:" + inputData); BigInteger sha = new BigInteger(encryptSHA(inputData)); //输出为32位的sha1字符串,也可以设置成输出为64位的 System.out.println("加密之后的SHA字符串为:\n" + sha.toString(32)); } public byte[] encryptSHA(byte[] data) throws Exception { //生成指定摘要算法的MessageDigest对象 MessageDigest sha = MessageDigest.getInstance(KEY_SHA); //使用指定字节更新摘要 sha.update(data); //通过执行诸如填充之类的最终操作完成哈希计算。 //sha.digest(); //使用指定的字节数组对摘要进行最后更新,然后完成摘要计算。 //digest(data); byte[] output = sha.digest(); return output; }}
MD5 算法具体实现
public class MD5{ public String KEY_MD5 = "MD5"; public String INPUTSTRING = "这是要用MD5加密的字符串";@Testpublic void testMD5() throws Exception{ byte[] bytes = INPUTSTRING.getBytes(); //加密前字符串 System.out.println("加密前:" + INPUTSTRING); byte[] output = encryptMD5(bytes); BigInteger md5 = new BigInteger(Coder.encryptMD5(output)); //加密完成 System.out.println("加密完成后:" + md5.toString(16));} public byte[] encryptMD5(byte[] data) throws Exception { MessageDigest md5 = MessageDigest.getInstance(KEY_MD5); md5.update(data); //返回的是一个存放hash值结果的byte数组 byte[] output = md5.digest(); return output; } }
BASE64加密具体实现
public class Base64{ @Test public void test() throws Exception { String inputStr = "要加密的字符串"; System.out.println("未加密之前:" + inputStr); byte[] inputData = inputStr.getBytes(); String code = encryptBASE64(inputData); System.out.println("BASE64加密后:" + code); byte[] output = Coder.decryptBASE64(code); String outputStr = new String(output); System.out.println("BASE64解密后:" + outputStr); // 验证BASE64加密解密一致性 assertEquals(inputStr, outputStr); } /** * BASE64解密 */ public byte[] decryptBASE64(String key) throws Exception { //API中查询不到BASE64Decoder,但是jdk中是含有这个类的 return (new BASE64Decoder()).decodeBuffer(key); } /** * BASE64加密 */ public String encryptBASE64(byte[] key) throws Exception { return (new BASE64Encoder()).encodeBuffer(key); } }
从上面Base64 的代码可以看出来,Base64 是可以求逆的,
如果在不使用非对称加密的情况下要对某些数据进行加密,
通常我们使用加密是两种加密方式配合使用的,
这样相对来说比单一加密方式安全性高一些。
HMAC具体代码的实现
public class HMAC1{/** * 定义加密方式 MAC算法可选以下多种算法 * HmacMD5 * HmacSHA1 * HmacSHA256 * HmacSHA384 * HmacSHA512 * </pre> */private final static String KEY_MAC = "HmacMD5";/** * 全局数组 */private final static String[] hexDigits = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f" };/** * 构造函数 */public HMAC1(){}/** * BASE64 加密 * * @param key * 需要加密的字节数组 * @return 字符串 * @throws Exception */public static String encryptBase64(byte[] key) throws Exception{ return (new BASE64Encoder()).encodeBuffer(key);}/** * BASE64 解密 * * @param key * 需要解密的字符串 * @return 字节数组 * @throws Exception */public static byte[] decryptBase64(String key) throws Exception{ return (new BASE64Decoder()).decodeBuffer(key);}/** * 初始化HMAC密钥 * * @return */public static String init(){ SecretKey key; String str = ""; try { KeyGenerator generator = KeyGenerator.getInstance(KEY_MAC); key = generator.generateKey(); str = encryptBase64(key.getEncoded()); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } return str;}/** * HMAC加密 * * @param data * 需要加密的字节数组 * @param key * 密钥 * @return 字节数组 */public static byte[] encryptHMAC(byte[] data, String key){ SecretKey secretKey; byte[] bytes = null; try { secretKey = new SecretKeySpec(decryptBase64(key), KEY_MAC); Mac mac = Mac.getInstance(secretKey.getAlgorithm()); mac.init(secretKey); bytes = mac.doFinal(data); } catch (Exception e) { e.printStackTrace(); } return bytes;}/** * HMAC加密 * * @param data * 需要加密的字符串 * @param key * 密钥 * @return 字符串 */public static String encryptHMAC(String data, String key){// if (StringUtils.isNullOrEmpty(data)) if(!((data.length()>0) && (data != ""))) { return null; } byte[] bytes = encryptHMAC(data.getBytes(), key); return byteArrayToHexString(bytes);}/** * 将一个字节转化成十六进制形式的字符串 * @return 字符串 */private static String byteToHexString(byte b){ int ret = b; if (ret < 0) { ret += 256; } int m = ret / 16; int n = ret % 16; return hexDigits[m] + hexDigits[n];}/** * 转换字节数组为十六进制字符串 * @return 十六进制字符串 */private static String byteArrayToHexString(byte[] bytes){ StringBuffer sb = new StringBuffer(); for (int i = 0; i < bytes.length; i++) { sb.append(byteToHexString(bytes[i])); } return sb.toString();}/** * 测试方法 * @param args */ public static void main(String[] args) throws Exception{ String key = HMAC1.init(); System.out.println("Mac密钥:" + key); String word = "这是要加密的字符串"; System.out.println(encryptHMAC(word, key)); }}
总结:一般来说,涉及到比较重要的数据,不会选择单向加密的算法,单向加密的算法更多的是
用在检测数据完整性上面,不过,对于不太重要的信息,用HMAC这样不可逆的算法也不错。
- 单向加密算法
- 单向加密算法
- 单向加密算法
- 单向加密算法
- 单向加密算法
- 单向加密算法
- 单向加密算法
- 单向加密算法
- 安卓MD5单向加密算法
- 安卓MD5单向加密算法
- 单向加密算法MD5&SHA&MAC
- 单向加密算法MD5和SHA
- 单向加密算法MD5和SHA
- Java 常用加密算法(一)---单向加密算法(MD5/SHA)
- BASE64与单向加密算法MD5&SHA&MAC
- 单向加密算法-BASE64、MD5、SHA、HMAC
- java加密技术一(单向加密算法)
- BASE64及单向加密算法--(MD5、SHA、HMAC)介绍
- ubuntu配置JDK
- Office电脑使用常见问题及解决方法
- jasperreport+iReport 5.6.0 版本下载地址
- 常用英语单词
- 希尔排序(shellsort)
- 单向加密算法
- golang 本地连接mssql sql server
- 多边形和圆的面积并
- Git使用点滴记录
- UVA - 10129 Play on Words (欧拉回路)
- ZeroMQ研究与应用分析
- GitHub整理开源工程
- session多服务器共享的方案梳理
- UVA 624 CD(01背包/记录路径)