站长网 安全 分析:说一下你常用的加密算法

分析:说一下你常用的加密算法

副标题#e# 常见的不可逆加密算法有MD5,HMAC,SHA1、SHA-224、SHA-256、SHA-384,和SHA-512,其中SHA-224、SHA-256、SHA-384,和SHA-512我们可以统称为SHA2加密算法,SHA加密算法的安全性要比MD5更高,而SHA2加密算法比SHA1的要高。其中SHA后面的数字表示的

副标题#e#

常见的不可逆加密算法有MD5,HMAC,SHA1、SHA-224、SHA-256、SHA-384,和SHA-512,其中SHA-224、SHA-256、SHA-384,和SHA-512我们可以统称为SHA2加密算法,SHA加密算法的安全性要比MD5更高,而SHA2加密算法比SHA1的要高。其中SHA后面的数字表示的是加密后的字符串长度,SHA1默认会产生一个160位的信息摘要。

不可逆加密算法最大的特点就是密钥,但是HMAC是需要密钥的【手动狗头】。

由于这些加密都是不可逆的,因此比较常用的场景就是用户密码加密,其验证过程就是通过比较两个加密后的字符串是否一样来确认身份的。网上也有很多自称是可以破解MD5密码的网站,其原理也是一样,就是有一个巨大的资源库,存放了许多字符串及对应的MD5加密后的字符串,通过你输入的MD5加密串来进行比较,如果过你的密码复杂度比较低,还是有很大机率验证出来的。

1.1 MD5

MD5信息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。

MD5算法有以下特点:

1、压缩性:无论数据长度是多少,计算出来的MD5值长度相同

2、容易计算性:由原数据容易计算出MD5值

3、抗修改性:即便修改一个字节,计算出来的MD5值也会巨大差异

4、抗碰撞性:知道数据和MD5值,很小概率找到相同MD5值相同的原数据。

public static String md5(String text) { 

   MessageDigest messageDigest = null; 

    try { 

         messageDigest = MessageDigest.getInstance("MD5"); 

     } catch (NoSuchAlgorithmException e) { 

         e.printStackTrace(); 

     } 

     byte[] bytes = messageDigest.digest(text.getBytes()); 

     return Hex.encodeHexString(bytes);  

1.2 SHA系列

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

2005年8月17日的CRYPTO会议尾声中王小云、姚期智、姚储枫再度发表更有效率的SHA-1攻击法,能在2的63次方个计算复杂度内找到碰撞。

也就是说SHA-1加密算法有碰撞的可能性,虽然很小。

public static String sha256(String text) { 

    MessageDigest messageDigest = null; 

    try { 

        messageDigest = MessageDigest.getInstance("SHA-256"); 

    } catch (NoSuchAlgorithmException e) { 

        e.printStackTrace(); 

    } 

    byte[] bytes = messageDigest.digest(text.getBytes());  

    return Hex.encodeHexString(bytes);  

1.3 HMAC系列

HMAC是密钥相关的哈希运算消息认证码(Hash-based Message Authentication Code)的缩写,由H.Krawezyk,M.Bellare,R.Canetti于1996年提出的一种基于Hash函数和密钥进行消息认证的方法,并于1997年作为RFC2104被公布,并在IPSec和其他网络协议(如SSL)中得以广泛应用,现在已经成为事实上的Internet安全标准。它可以与任何迭代散列函数捆绑使用。

HMAC算法更像是一种加密算法,它引入了密钥,其安全性已经不完全依赖于所使用的Hash算法

public static String hmacSha256(String text, SecretKeySpec sk) { 

    Mac mac = null; 

    try { 

        mac = Mac.getInstance("HmacSHA256"); 

    } catch (NoSuchAlgorithmException e) { 

        e.printStackTrace(); 

    } 

    try { 

        mac.init(sk); 

    } catch (InvalidKeyException e) { 

        e.printStackTrace(); 

    } 

    byte[] rawHmac = mac.doFinal(text.getBytes()); 

    return new String(Base64.encodeBase64(rawHmac)); 

如果要使用不可逆加密,推荐使用SHA256、SHA384、SHA512以及HMAC-SHA256、HMAC-SHA384、HMAC-SHA512这几种算法。

二、对称加密算法

#p#副标题#e#

对称加密算法是应用比较早的算法,在数据加密和解密的时用的都是同一个密钥,这就造成了密钥管理困难的问题。常见的对称加密算法有DES、3DES、AES128、AES192、AES256 (默认安装的 JDK 尚不支持 AES256,需要安装对应的 jce 补丁进行升级 jce1.7,jce1.8)。其中AES后面的数字代表的是密钥长度。对称加密算法的安全性相对较低,比较适用的场景就是内网环境中的加解密。

2.1 DES

DES是对称加密算法领域中的典型算法,其密钥默认长度为56位。

/ 加密 

 public static String encrypt(byte[] dataSource, String password){ 

      try { 

          SecureRandom random = new SecureRandom(); 

          DESKeySpec desKeySpec = new DESKeySpec(password.getBytes()); 

          //创建一个密匙工厂,然后用它把DESKeySpec转换成  

          SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance("DES");  

          SecretKey secretKey = secretKeyFactory.generateSecret(desKeySpec);  

          //Cipher对象实际完成加密操作  

         Cipher cipher = Cipher.getInstance("DES");  

         //用密匙初始化Cipher对象  

         cipher.init(Cipher.ENCRYPT_MODE, secretKey, random);  

         //正式执行加密操作  

         return Base64.encodeBase64String(cipher.doFinal(dataSource));  

     } catch (Throwable e) {  

         e.printStackTrace();  

     } return null;  

 }  

// 解密 

public static String decrypt(String src, String password) throws Exception{  

    // DES算法要求有一个可信任的随机数源  

    SecureRandom random = new SecureRandom();  

    // 创建一个DESKeySpec对象  

    DESKeySpec desKeySpec = new DESKeySpec(password.getBytes());  

    // 创建一个密匙工厂  

    SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");  

    // 将DESKeySpec对象转换成SecretKey对象  

    SecretKey secretKey = keyFactory.generateSecret(desKeySpec);  

    // Cipher对象实际完成解密操作  

    Cipher cipher = Cipher.getInstance("DES");  

    // 用密匙初始化Cipher对象  

    cipher.init(Cipher.DECRYPT_MODE, secretKey, random);  

    // 真正开始解密操作  

    return new String(cipher.doFinal(Base64.decodeBase64(src)));  

2.2 3DES

#p#副标题#e##p#分页标题#e#

3DES(即Triple DES)是DES向AES过渡的加密算法,它使用3条56位的密钥对数据进行三次加密。是DES的一个更安全的变形。它以DES为基本模块,通过组合分组方法设计出分组加密算法。比起最初的DES,3DES更为安全。密钥长度默认为168位,还可以选择128位。

本文来自网络,不代表站长网立场,转载请注明出处:https://www.tzzz.com.cn/html/fuwuqi/anquan/2021/0630/11964.html

作者: dawei

【声明】:站长网内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。
联系我们

联系我们

0577-28828765

在线咨询: QQ交谈

邮箱: xwei067@foxmail.com

工作时间:周一至周五,9:00-17:30,节假日休息

返回顶部