加密算法我们整体可以分为:可逆加密和不可逆加密,可逆加密又可以分为:对称加密和非对称加密 。
一、不可逆加密常见的不可逆加密算法有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这几种算法 。二、对称加密算法对称加密算法是应用比较早的算法,在数据加密和解密的时用的都是同一个密钥,这就造成了密钥管理困难的问题 。常见的对称加密算法有DES、3DES、AES128、AES192、AES256 (默认安装的 JDK 尚不支持 AES256,需要安装对应的 jce 补丁进行升级 jce1.7,jce1.8) 。其中AES后面的数字代表的是密钥长度 。对称加密算法的安全性相对较低,比较适用的场景就是内网环境中的加解密 。
2.1 DESDES是对称加密算法领域中的典型算法,其密钥默认长度为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))); }
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 鸡蛋抹茶小饼干的做法,抹茶拐杖饼干的做法
- 口感淡的茶就不值钱,熟茶的泡法
- 高并发的前后端的一般处理
- SimCLR框架的理解和代码实现以及代码讲解
- 最强的开发者技术路线图已经更新到 2020 GitHub 超 118k还有中文
- 是时候更新手里的武器了—Jetpack架构组件简析
- TCP 重置攻击的工作原理
- 想知道是什么占用你的电脑空间,正确使用Windows 10查看磁盘空间
- 为什么你买的光纤跳线那么便宜,原来这里面门道不少
- 火山爆发之后流出的岩浆最后形成什么了 为什么火山里面会有岩浆