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<String, Object> 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<String, Object> keyMap = new HashMap<String, Object>();     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<String, Object> keyMap) {     Key key = (Key) keyMap.get(PRIVATE_KEY);     return key.getEncoded(); }  /**   * 取得公钥   *   * @param keyMap 密钥map   * @return byte[] 公钥   */ public static byte[] getPublicKey(Map<String, Object> keyMap) throws Exception {     Key key = (Key) keyMap.get(PUBLIC_KEY);     return key.getEncoded(); }

四、加密盐

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

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

16

2026.03.11

Go高并发任务调度与Goroutine池化实践
Go高并发任务调度与Goroutine池化实践

本专题围绕 Go 语言在高并发任务处理场景中的实践展开,系统讲解 Goroutine 调度模型、Channel 通信机制以及并发控制策略。内容包括任务队列设计、Goroutine 池化管理、资源限制控制以及并发任务的性能优化方法。通过实际案例演示,帮助开发者构建稳定高效的 Go 并发任务处理系统,提高系统在高负载环境下的处理能力与稳定性。

23

2026.03.10

Kotlin Android模块化架构与组件化开发实践
Kotlin Android模块化架构与组件化开发实践

本专题围绕 Kotlin 在 Android 应用开发中的架构实践展开,重点讲解模块化设计与组件化开发的实现思路。内容包括项目模块拆分策略、公共组件封装、依赖管理优化、路由通信机制以及大型项目的工程化管理方法。通过真实项目案例分析,帮助开发者构建结构清晰、易扩展且维护成本低的 Android 应用架构体系,提升团队协作效率与项目迭代速度。

75

2026.03.09

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

95

2026.03.06

Rust内存安全机制与所有权模型深度实践
Rust内存安全机制与所有权模型深度实践

本专题围绕 Rust 语言核心特性展开,深入讲解所有权机制、借用规则、生命周期管理以及智能指针等关键概念。通过系统级开发案例,分析内存安全保障原理与零成本抽象优势,并结合并发场景讲解 Send 与 Sync 特性实现机制。帮助开发者真正理解 Rust 的设计哲学,掌握在高性能与安全性并重场景中的工程实践能力。

218

2026.03.05

PHP高性能API设计与Laravel服务架构实践
PHP高性能API设计与Laravel服务架构实践

本专题围绕 PHP 在现代 Web 后端开发中的高性能实践展开,重点讲解基于 Laravel 框架构建可扩展 API 服务的核心方法。内容涵盖路由与中间件机制、服务容器与依赖注入、接口版本管理、缓存策略设计以及队列异步处理方案。同时结合高并发场景,深入分析性能瓶颈定位与优化思路,帮助开发者构建稳定、高效、易维护的 PHP 后端服务体系。

420

2026.03.04

AI安装教程大全
AI安装教程大全

2026最全AI工具安装教程专题:包含各版本AI绘图、AI视频、智能办公软件的本地化部署手册。全篇零基础友好,附带最新模型下载地址、一键安装脚本及常见报错修复方案。每日更新,收藏这一篇就够了,让AI安装不再报错!

168

2026.03.04

Swift iOS架构设计与MVVM模式实战
Swift iOS架构设计与MVVM模式实战

本专题聚焦 Swift 在 iOS 应用架构设计中的实践,系统讲解 MVVM 模式的核心思想、数据绑定机制、模块拆分策略以及组件化开发方法。内容涵盖网络层封装、状态管理、依赖注入与性能优化技巧。通过完整项目案例,帮助开发者构建结构清晰、可维护性强的 iOS 应用架构体系。

222

2026.03.03

C++高性能网络编程与Reactor模型实践
C++高性能网络编程与Reactor模型实践

本专题围绕 C++ 在高性能网络服务开发中的应用展开,深入讲解 Socket 编程、多路复用机制、Reactor 模型设计原理以及线程池协作策略。内容涵盖 epoll 实现机制、内存管理优化、连接管理策略与高并发场景下的性能调优方法。通过构建高并发网络服务器实战案例,帮助开发者掌握 C++ 在底层系统与网络通信领域的核心技术。

33

2026.03.03

热门下载

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

精品课程

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

共18课时 | 6.9万人学习

Django 教程
Django 教程

共28课时 | 4.9万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3.6万人学习

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

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