单向加密算法

来源:互联网 发布: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这样不可逆的算法也不错。

0 0