0

0

web中常用的加密算法有哪些

WBOY

WBOY

发布时间:2023-05-16 14:43:12

|

2219人浏览过

|

来源于亿速云

转载

 web中常用的加密算法有哪些

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

一、不可逆加密

常见的不可逆加密算法有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安全标准。它可以与任何迭代散列函数捆绑使用。

动态WEB网站中的PHP和MySQL:直观的QuickPro指南第2版
动态WEB网站中的PHP和MySQL:直观的QuickPro指南第2版

动态WEB网站中的PHP和MySQL详细反映实际程序的需求,仔细地探讨外部数据的验证(例如信用卡卡号的格式)、用户登录以及如何使用模板建立网页的标准外观。动态WEB网站中的PHP和MySQL的内容不仅仅是这些。书中还提到如何串联JavaScript与PHP让用户操作时更快、更方便。还有正确处理用户输入错误的方法,让网站看起来更专业。另外还引入大量来自PEAR外挂函数库的强大功能,对常用的、强大的包

下载

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 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

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

public static String encryptThreeDESECB(String src, String key) {      try{          DESedeKeySpec dks = new DESedeKeySpec(key.getBytes("UTF-8"));          SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DESede");          SecretKey securekey = keyFactory.generateSecret(dks);            Cipher cipher = Cipher.getInstance("DESede/ECB/PKCS5Padding");          cipher.init(Cipher.ENCRYPT_MODE, securekey);          byte[] b = cipher.doFinal(src.getBytes("UTF-8"));          String ss = new String(Base64.encodeBase64(b));         ss = ss.replaceAll("\\+", "-");         ss = ss.replaceAll("/", "_");         return ss;     } catch(Exception ex){         ex.printStackTrace();         return src;     } }  public static String decryptThreeDESECB(String src, String key) {     try{         src = src.replaceAll("-", "+");         src = src.replaceAll("_", "/");         byte[] bytesrc = Base64.decodeBase64(src.getBytes("UTF-8"));         // --解密的key         DESedeKeySpec dks = new DESedeKeySpec(key.getBytes("UTF-8"));         SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DESede");         SecretKey securekey = keyFactory.generateSecret(dks);          // --Chipher对象解密         Cipher cipher = Cipher.getInstance("DESede/ECB/PKCS5Padding");         cipher.init(Cipher.DECRYPT_MODE, securekey);         byte[] retByte = cipher.doFinal(bytesrc);          return new String(retByte, "UTF-8");     } catch(Exception ex){         ex.printStackTrace();         return src;     } }

2.3 AES

AES  高级数据加密标准,能够有效抵御已知的针对DES算法的所有攻击,默认密钥长度为128位,还可以供选择192位,256位。这里顺便提一句这个位指的是bit。

private static final String defaultCharset = "UTF-8"; private static final String KEY_AES = "AES"; private static final String KEY_MD5 = "MD5"; private static MessageDigest md5Digest; static {     try {         md5Digest = MessageDigest.getInstance(KEY_MD5);     } catch (NoSuchAlgorithmException e) {      } } /**   * 加密   */ public static String encrypt(String data, String key) {     return doAES(data, key, Cipher.ENCRYPT_MODE); } /**   * 解密   */ public static String decrypt(String data, String key) {     return doAES(data, key, Cipher.DECRYPT_MODE); }   /**   * 加解密   */ private static String doAES(String data, String key, int mode) {     try {         boolean encrypt = mode == Cipher.ENCRYPT_MODE;         byte[] content;         if (encrypt) {             content = data.getBytes(defaultCharset);         } else {             content = Base64.decodeBase64(data.getBytes());         }         SecretKeySpec keySpec = new SecretKeySpec(md5Digest.digest(key.getBytes(defaultCharset))                                                   , KEY_AES);         Cipher cipher = Cipher.getInstance(KEY_AES);// 创建密码器         cipher.init(mode, keySpec);// 初始化         byte[] result = cipher.doFinal(content);         if (encrypt) {             return new String(Base64.encodeBase64(result));         } else {             return new String(result, defaultCharset);         }     } catch (Exception e) {     }     return null; }

推荐使用对称加密算法有:AES128、AES192、AES256。

三、非对称加密算法

非对称加密算法有两个密钥,这两个密钥完全不同但又完全匹配。只有使用匹配的一对公钥和私钥,才能完成对明文的加密和解密过程。常见的非对称加密有RSA、SM2等。

3.1 RSA

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

//非对称密钥算法   public static final String KEY_ALGORITHM = "RSA";      /**     * 密钥长度,DH算法的默认密钥长度是1024     * 密钥长度必须是64的倍数,在512到65536位之间     */   private static final int KEY_SIZE = 1024;   //公钥 private static final String PUBLIC_KEY = "RSAPublicKey"; //私钥 private static final String PRIVATE_KEY = "RSAPrivateKey"; /**   * 初始化密钥对   *   * @return Map 甲方密钥的Map   */ public static Map initKey() throws Exception {     //实例化密钥生成器     KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(KEY_ALGORITHM);     //初始化密钥生成器     keyPairGenerator.initialize(KEY_SIZE);     //生成密钥对     KeyPair keyPair = keyPairGenerator.generateKeyPair();     //甲方公钥     RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();     //甲方私钥     RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();     //将密钥存储在map中     Map keyMap = new HashMap();     keyMap.put(PUBLIC_KEY, publicKey);     keyMap.put(PRIVATE_KEY, privateKey);     return keyMap; } /**   * 私钥加密   *   * @param data 待加密数据   * @param key  密钥   * @return byte[] 加密数据   */ public static byte[] encryptByPrivateKey(byte[] data, byte[] key) throws Exception {      //取得私钥     PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(key);     KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);     //生成私钥     PrivateKey privateKey = keyFactory.generatePrivate(pkcs8KeySpec);     //数据加密     Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());     cipher.init(Cipher.ENCRYPT_MODE, privateKey);     return cipher.doFinal(data); }  /**   * 公钥加密   *   * @param data 待加密数据   * @param key  密钥   * @return byte[] 加密数据   */ public static byte[] encryptByPublicKey(byte[] data, byte[] key) throws Exception {      //实例化密钥工厂     KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);     //初始化公钥     //密钥材料转换     X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(key);     //产生公钥     PublicKey pubKey = keyFactory.generatePublic(x509KeySpec);     //数据加密     Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());     cipher.init(Cipher.ENCRYPT_MODE, pubKey);     return cipher.doFinal(data); }  /**   * 私钥解密   *   * @param data 待解密数据   * @param key  密钥   * @return byte[] 解密数据   */ public static byte[] decryptByPrivateKey(byte[] data, byte[] key) throws Exception {     //取得私钥     PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(key);     KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);     //生成私钥     PrivateKey privateKey = keyFactory.generatePrivate(pkcs8KeySpec);     //数据解密     Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());     cipher.init(Cipher.DECRYPT_MODE, privateKey);     return cipher.doFinal(data); }  /**   * 公钥解密   *   * @param data 待解密数据   * @param key  密钥   * @return byte[] 解密数据   */ public static byte[] decryptByPublicKey(byte[] data, byte[] key) throws Exception {      //实例化密钥工厂     KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);     //初始化公钥     //密钥材料转换     X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(key);     //产生公钥     PublicKey pubKey = keyFactory.generatePublic(x509KeySpec);     //数据解密     Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());     cipher.init(Cipher.DECRYPT_MODE, pubKey);     return cipher.doFinal(data); }  /**   * 取得私钥   *   * @param keyMap 密钥map   * @return byte[] 私钥   */ public static byte[] getPrivateKey(Map keyMap) {     Key key = (Key) keyMap.get(PRIVATE_KEY);     return key.getEncoded(); }  /**   * 取得公钥   *   * @param keyMap 密钥map   * @return byte[] 公钥   */ public static byte[] getPublicKey(Map keyMap) throws Exception {     Key key = (Key) keyMap.get(PUBLIC_KEY);     return key.getEncoded(); }

四、加密盐

加密盐也是比较常听到的一个概念,盐就是一个随机字符串用来和我们的加密串拼接后进行加密。加盐主要是为了提供加密字符串的安全性。假如有一个加盐后的加密串,黑客通过一定手段这个加密串,他拿到的明文,并不是我们加密前的字符串,而是加密前的字符串和盐组合的字符串,这样相对来说又增加了字符串的安全性。

相关专题

更多
云朵浏览器入口合集
云朵浏览器入口合集

本专题整合了云朵浏览器入口合集,阅读专题下面的文章了解更多详细地址。

20

2026.01.20

Java JVM 原理与性能调优实战
Java JVM 原理与性能调优实战

本专题系统讲解 Java 虚拟机(JVM)的核心工作原理与性能调优方法,包括 JVM 内存结构、对象创建与回收流程、垃圾回收器(Serial、CMS、G1、ZGC)对比分析、常见内存泄漏与性能瓶颈排查,以及 JVM 参数调优与监控工具(jstat、jmap、jvisualvm)的实战使用。通过真实案例,帮助学习者掌握 Java 应用在生产环境中的性能分析与优化能力。

28

2026.01.20

PS使用蒙版相关教程
PS使用蒙版相关教程

本专题整合了ps使用蒙版相关教程,阅读专题下面的文章了解更多详细内容。

149

2026.01.19

java用途介绍
java用途介绍

本专题整合了java用途功能相关介绍,阅读专题下面的文章了解更多详细内容。

120

2026.01.19

java输出数组相关教程
java输出数组相关教程

本专题整合了java输出数组相关教程,阅读专题下面的文章了解更多详细内容。

41

2026.01.19

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

10

2026.01.19

xml格式相关教程
xml格式相关教程

本专题整合了xml格式相关教程汇总,阅读专题下面的文章了解更多详细内容。

14

2026.01.19

PHP WebSocket 实时通信开发
PHP WebSocket 实时通信开发

本专题系统讲解 PHP 在实时通信与长连接场景中的应用实践,涵盖 WebSocket 协议原理、服务端连接管理、消息推送机制、心跳检测、断线重连以及与前端的实时交互实现。通过聊天系统、实时通知等案例,帮助开发者掌握 使用 PHP 构建实时通信与推送服务的完整开发流程,适用于即时消息与高互动性应用场景。

23

2026.01.19

微信聊天记录删除恢复导出教程汇总
微信聊天记录删除恢复导出教程汇总

本专题整合了微信聊天记录相关教程大全,阅读专题下面的文章了解更多详细内容。

168

2026.01.18

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
CSS3 教程
CSS3 教程

共18课时 | 4.7万人学习

Django 教程
Django 教程

共28课时 | 3.3万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 2.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号