加密算法我们整体可以分为:可逆加密和不可逆加密,可逆加密又可以分为:对称加密和非对称加密。

 面试官:说一下你常用的加密算法(面试官:说一下你常用的加密算法有哪些) 加密 算法 第1张

加密算法咱们全体可以分为:可逆加密和不可逆加密,可逆加密又可以分为:对称加密和非对称加密。

一、不可逆加密

常见的不可逆加密算法有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值相同的原数据。

  1. publicstaticStringmd5(Stringtext){
  2. MessageDigestmessageDigest=null;
  3. try{
  4. messageDigest=MessageDigest.getInstance("MD5");
  5. }catch(NoSuchAlgorithmExceptione){
  6. e.printStackTrace();
  7. }
  8. byte[]bytes=messageDigest.digest(text.getBytes());
  9. returnHex.encodeHexString(bytes);
  10. }

1.2 SHA系列

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

2005年8月17日的CRYPTO会议结尾中王小云、姚期智、姚储枫再度宣布更有功率的SHA-1进犯法,能在2的63次方个核算复杂度内找到磕碰。

也便是说SHA-1加密算法有磕碰的可能性,尽管很小。

  1. publicstaticStringsha256(Stringtext){
  2. MessageDigestmessageDigest=null;
  3. try{
  4. messageDigest=MessageDigest.getInstance("SHA-256");
  5. }catch(NoSuchAlgorithmExceptione){
  6. e.printStackTrace();
  7. }
  8. byte[]bytes=messageDigest.digest(text.getBytes());
  9. returnHex.encodeHexString(bytes);
  10. }

1.3 HMAC系列

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

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

  1. publicstaticStringhmacSha256(Stringtext,SecretKeySpecsk){
  2. Macmac=null;
  3. try{
  4. mac=Mac.getInstance("HmacSHA256");
  5. }catch(NoSuchAlgorithmExceptione){
  6. e.printStackTrace();
  7. }
  8. try{
  9. mac.init(sk);
  10. }catch(InvalidKeyExceptione){
  11. e.printStackTrace();
  12. }
  13. byte[]rawHmac=mac.doFinal(text.getBytes());
  14. returnnewString(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 DES

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

  1. /加密
  2. publicstaticStringencrypt(byte[]dataSource,Stringpassword){
  3. try{
  4. SecureRandomrandom=newSecureRandom();
  5. DESKeySpecdesKeySpec=newDESKeySpec(password.getBytes());
  6. //创立一个密匙工厂,然后用它把DESKeySpec转化成
  7. SecretKeyFactorysecretKeyFactory=SecretKeyFactory.getInstance("DES");
  8. SecretKeysecretKey=secretKeyFactory.generateSecret(desKeySpec);
  9. //Cipher目标实践完结加密操作
  10. Ciphercipher=Cipher.getInstance("DES");
  11. //用密匙初始化Cipher目标
  12. cipher.init(Cipher.ENCRYPT_MODE,secretKey,random);
  13. //正式履行加密操作
  14. returnBase64.encodeBase64String(cipher.doFinal(dataSource));
  15. }catch(Throwablee){
  16. e.printStackTrace();
  17. }returnnull;
  18. }
  19. //解密
  20. publicstaticStringdecrypt(Stringsrc,Stringpassword)throwsException{
  21. //DES算法要求有一个可信任的随机数源
  22. SecureRandomrandom=newSecureRandom();
  23. //创立一个DESKeySpec目标
  24. DESKeySpecdesKeySpec=newDESKeySpec(password.getBytes());
  25. //创立一个密匙工厂
  26. SecretKeyFactorykeyFactory=SecretKeyFactory.getInstance("DES");
  27. //将DESKeySpec目标转化成SecretKey目标
  28. SecretKeysecretKey=keyFactory.generateSecret(desKeySpec);
  29. //Cipher目标实践完结解密操作
  30. Ciphercipher=Cipher.getInstance("DES");
  31. //用密匙初始化Cipher目标
  32. cipher.init(Cipher.DECRYPT_MODE,secretKey,random);
  33. //真实开端解密操作
  34. returnnewString(cipher.doFinal(Base64.decodeBase64(src)));
  35. }

2.2 3DES

3DES(即Triple DES)是DES向AES过渡的加密算法,它运用3条56位的密钥对数据进行三次加密。是DES的一个更安全的变形。它以DES为根本模块,经过组合分组办法规划出分组加密算法。比起开始的DES,3DES更为安全。密钥长度默许为168位,还可以挑选128位。

  1. publicstaticStringencryptThreeDESECB(Stringsrc,Stringkey){
  2. try{
  3. DESedeKeySpecdks=newDESedeKeySpec(key.getBytes("UTF-8"));
  4. SecretKeyFactorykeyFactory=SecretKeyFactory.getInstance("DESede");
  5. SecretKeysecurekey=keyFactory.generateSecret(dks);
  6. Ciphercipher=Cipher.getInstance("DESede/ECB/PKCS5Padding");
  7. cipher.init(Cipher.ENCRYPT_MODE,securekey);
  8. byte[]b=cipher.doFinal(src.getBytes("UTF-8"));
  9. Stringss=newString(Base64.encodeBase64(b));
  10. ss=ss.replaceAll("\\+","-");
  11. ss=ss.replaceAll("/","_");
  12. returnss;
  13. }catch(Exceptionex){
  14. ex.printStackTrace();
  15. returnsrc;
  16. }
  17. }
  18. publicstaticStringdecryptThreeDESECB(Stringsrc,Stringkey){
  19. try{
  20. src=src.replaceAll("-","+");
  21. src=src.replaceAll("_","/");
  22. byte[]bytesrc=Base64.decodeBase64(src.getBytes("UTF-8"));
  23. //--解密的key
  24. DESedeKeySpecdks=newDESedeKeySpec(key.getBytes("UTF-8"));
  25. SecretKeyFactorykeyFactory=SecretKeyFactory.getInstance("DESede");
  26. SecretKeysecurekey=keyFactory.generateSecret(dks);
  27. //--Chipher目标解密
  28. Ciphercipher=Cipher.getInstance("DESede/ECB/PKCS5Padding");
  29. cipher.init(Cipher.DECRYPT_MODE,securekey);
  30. byte[]retByte=cipher.doFinal(bytesrc);
  31. returnnewString(retByte,"UTF-8");
  32. }catch(Exceptionex){
  33. ex.printStackTrace();
  34. returnsrc;
  35. }
  36. }

2.3 AES

AES 高档数据加密规范,可以有用抵挡已知的针对DES算法的一切进犯,默许密钥长度为128位,还可以供挑选192位,256位。这儿趁便提一句这个位指的是bit。

  1. privatestaticfinalStringdefaultCharset="UTF-8";
  2. privatestaticfinalStringKEY_AES="AES";
  3. privatestaticfinalStringKEY_MD5="MD5";
  4. privatestaticMessageDigestmd5Digest;
  5. static{
  6. try{
  7. md5Digest=MessageDigest.getInstance(KEY_MD5);
  8. }catch(NoSuchAlgorithmExceptione){
  9. }
  10. }
  11. /**
  12. *加密
  13. */
  14. publicstaticStringencrypt(Stringdata,Stringkey){
  15. returndoAES(data,key,Cipher.ENCRYPT_MODE);
  16. }
  17. /**
  18. *解密
  19. */
  20. publicstaticStringdecrypt(Stringdata,Stringkey){
  21. returndoAES(data,key,Cipher.DECRYPT_MODE);
  22. }
  23. /**
  24. *加解密
  25. */
  26. privatestaticStringdoAES(Stringdata,Stringkey,intmode){
  27. try{
  28. booleanencrypt=mode==Cipher.ENCRYPT_MODE;
  29. byte[]content;
  30. if(encrypt){
  31. content=data.getBytes(defaultCharset);
  32. }else{
  33. content=Base64.decodeBase64(data.getBytes());
  34. }
  35. SecretKeySpeckeySpec=newSecretKeySpec(md5Digest.digest(key.getBytes(defaultCharset))
  36. ,KEY_AES);
  37. Ciphercipher=Cipher.getInstance(KEY_AES);//创立暗码器
  38. cipher.init(mode,keySpec);//初始化
  39. byte[]result=cipher.doFinal(content);
  40. if(encrypt){
  41. returnnewString(Base64.encodeBase64(result));
  42. }else{
  43. returnnewString(result,defaultCharset);
  44. }
  45. }catch(Exceptione){
  46. }
  47. returnnull;
  48. }

引荐运用对称加密算法有:AES128、AES192、AES256。

三、非对称加密算法

非对称加密算法有两个密钥,这两个密钥彻底不同但又彻底匹配。只要运用匹配的一对公钥和私钥,才干完结对明文的加密和解密进程。常见的非对称加密有RSA、SM2等。

3.1 RSA

RSA密钥至少为500位长,一般引荐运用1024位。

  1. //非对称密钥算法
  2. publicstaticfinalStringKEY_ALGORITHM="RSA";
  3. /**
  4. *密钥长度,DH算法的默许密钥长度是1024
  5. *密钥长度有必要是64的倍数,在512到65536位之间
  6. */
  7. privatestaticfinalintKEY_SIZE=1024;
  8. //公钥
  9. privatestaticfinalStringPUBLIC_KEY="RSAPublicKey";
  10. //私钥
  11. privatestaticfinalStringPRIVATE_KEY="RSAPrivateKey";
  12. /**
  13. *初始化密钥对
  14. *
  15. *@returnMap甲方密钥的Map
  16. */
  17. publicstaticMap<String,Object>initKey()throwsException{
  18. //实例化密钥生成器
  19. KeyPairGeneratorkeyPairGenerator=KeyPairGenerator.getInstance(KEY_ALGORITHM);
  20. //初始化密钥生成器
  21. keyPairGenerator.initialize(KEY_SIZE);
  22. //生成密钥对
  23. KeyPairkeyPair=keyPairGenerator.generateKeyPair();
  24. //甲方公钥
  25. RSAPublicKeypublicKey=(RSAPublicKey)keyPair.getPublic();
  26. //甲方私钥
  27. RSAPrivateKeyprivateKey=(RSAPrivateKey)keyPair.getPrivate();
  28. //将密钥存储在map中
  29. Map<String,Object>keyMap=newHashMap<String,Object>();
  30. keyMap.put(PUBLIC_KEY,publicKey);
  31. keyMap.put(PRIVATE_KEY,privateKey);
  32. returnkeyMap;
  33. }
  34. /**
  35. *私钥加密
  36. *
  37. *@paramdata待加密数据
  38. *@paramkey密钥
  39. *@returnbyte[]加密数据
  40. */
  41. publicstaticbyte[]encryptByPrivateKey(byte[]data,byte[]key)throwsException{
  42. //获得私钥
  43. PKCS8EncodedKeySpecpkcs8KeySpec=newPKCS8EncodedKeySpec(key);
  44. KeyFactorykeyFactory=KeyFactory.getInstance(KEY_ALGORITHM);
  45. //生成私钥
  46. PrivateKeyprivateKey=keyFactory.generatePrivate(pkcs8KeySpec);
  47. //数据加密
  48. Ciphercipher=Cipher.getInstance(keyFactory.getAlgorithm());
  49. cipher.init(Cipher.ENCRYPT_MODE,privateKey);
  50. returncipher.doFinal(data);
  51. }
  52. /**
  53. *公钥加密
  54. *
  55. *@paramdata待加密数据
  56. *@paramkey密钥
  57. *@returnbyte[]加密数据
  58. */
  59. publicstaticbyte[]encryptByPublicKey(byte[]data,byte[]key)throwsException{
  60. //实例化密钥工厂
  61. KeyFactorykeyFactory=KeyFactory.getInstance(KEY_ALGORITHM);
  62. //初始化公钥
  63. //密钥资料转化
  64. X509EncodedKeySpecx509KeySpec=newX509EncodedKeySpec(key);
转载请说明出处
知优网 » 面试官:说一下你常用的加密算法(面试官:说一下你常用的加密算法有哪些)

发表评论

您需要后才能发表评论