当前位置: 首页 > news >正文

对称/非对称加密

对称加密和非对称加密是两种主要的加密方式,用于保护数据的机密性和完整性。它们在密钥的使用和管理上有着显著的不同。

对称加密

原理

对称加密(Symmetric Encryption)使用相同的密钥进行加密和解密。这意味着发送方和接收方必须共享相同的密钥。其加密和解密过程可以简单描述如下:

  1. 加密过程

    • 明文(Plaintext)通过对称加密算法和密钥(Key)进行处理,生成密文(Ciphertext)。
    • 公式:Ciphertext = Encrypt(Plaintext, Key)
  2. 解密过程

    • 密文通过相同的对称加密算法和密钥进行处理,还原为明文。
    • 公式:Plaintext = Decrypt(Ciphertext, Key)
常见的对称加密算法
  • DES(Data Encryption Standard):一种早期的对称加密算法,使用56位密钥。
  • AES(Advanced Encryption Standard):一种现代对称加密算法,支持128位、192位和256位密钥长度。
  • 3DES(Triple DES):DES的增强版,通过三次加密提高安全性。

非对称加密

原理

非对称加密(Asymmetric Encryption)使用一对密钥:公钥(Public Key)和私钥(Private Key)。公钥用于加密,私钥用于解密。加密和解密过程如下:

  1. 加密过程

    • 发送方使用接收方的公钥对明文进行加密,生成密文。
    • 公式:Ciphertext = Encrypt(Plaintext, Public Key)
  2. 解密过程

    • 接收方使用自己的私钥对密文进行解密,还原为明文。
    • 公式:Plaintext = Decrypt(Ciphertext, Private Key)

这种方法解决了密钥分发的问题,因为公钥可以公开,只有私钥需要保密。

常见的非对称加密算法
  • RSA(Rivest-Shamir-Adleman):一种常见的非对称加密算法,基于大整数因子分解的困难性。
  • ECC(Elliptic Curve Cryptography):一种基于椭圆曲线数学的非对称加密算法,提供与RSA相同安全级别的同时使用更短的密钥。

对称加密和非对称加密的比较

  • 速度:对称加密通常比非对称加密更快,适合处理大量数据。
  • 密钥管理:对称加密需要安全地共享密钥,而非对称加密通过公钥和私钥的分离简化了密钥管理。
  • 应用场景
    • 对称加密常用于数据的批量加密,如文件加密和数据库加密。
    • 非对称加密常用于密钥交换和数字签名。

这两种加密方式各有优劣,常常在实际应用中结合使用。例如,在SSL/TLS协议中,非对称加密用于密钥交换,而对称加密用于数据传输。


盐值

在加解密过程中,**盐值(Salt)**是一种用于增强密码安全性的技术,特别是在密码哈希和存储中广泛使用。盐值的作用主要体现在以下几个方面:

盐值的定义

盐值是一个随机生成的字符串,在对密码进行哈希处理之前,将其与密码组合在一起。这个组合后的字符串再通过哈希函数生成最终的哈希值。盐值通常是唯一的,并且在每次用户注册或密码变更时生成不同的盐值。

盐值的作用

  1. 防止彩虹表攻击

    • 彩虹表攻击是一种通过预计算大量可能的哈希值并存储在表中来快速破解密码的方法。因为常用密码(如“123456”)的哈希值是固定的,攻击者可以使用预先计算好的哈希值直接找到原密码。
    • 加入盐值后,即使多个用户使用相同的密码,由于每个用户的盐值不同,最终生成的哈希值也不同,从而防止了彩虹表攻击。
  2. 增加哈希值的复杂性

    • 盐值增加了密码的长度和复杂性,使得简单密码变得更加难以猜测。
    • 这也意味着攻击者在试图进行暴力破解时,需要为每个不同的盐值和密码组合计算哈希值,大大增加了破解难度和时间。
  3. 防止相同密码产生相同哈希值

    • 如果没有盐值,相同的密码将生成相同的哈希值。攻击者可以通过比较哈希值,找出使用相同密码的账户。
    • 盐值确保即使密码相同,由于盐值不同,最终生成的哈希值也不同,从而保护用户的隐私。

盐值的使用过程

  1. 生成盐值

    • 在用户设置或更改密码时,生成一个随机的盐值。这个盐值的长度和复杂度应足够大,以保证其唯一性和安全性。
  2. 组合密码和盐值

    • 将生成的盐值与用户输入的密码组合在一起。通常是将盐值附加在密码的前面或后面,或通过其他定义的方式进行组合。
  3. 计算哈希值

    • 对组合后的字符串进行哈希处理,生成最终的哈希值。
  4. 存储哈希值和盐值

    • 将生成的哈希值和盐值存储在数据库中。注意,盐值不需要保密,可以明文存储,因为它的作用主要在于防止攻击者轻易破解密码。

示例代码

下面是一个简单的示例代码,展示了如何使用盐值进行密码哈希处理:

import hashlib
import os# 生成随机盐值
def generate_salt():return os.urandom(16)  # 生成16字节的随机盐值# 生成密码哈希
def hash_password(password, salt):# 将盐值与密码组合salted_password = salt + password.encode('utf-8')# 使用SHA-256哈希算法生成哈希值return hashlib.sha256(salted_password).hexdigest()# 示例
password = "my_secure_password"
salt = generate_salt()
hashed_password = hash_password(password, salt)print("Salt:", salt.hex())
print("Hashed Password:", hashed_password)

在上述示例中,盐值通过os.urandom()生成,并与密码组合后使用SHA-256进行哈希处理。最终生成的哈希值和盐值可以存储在数据库中。

总结

盐值在加解密过程中,特别是在密码哈希处理中,起到了增强安全性的作用。它通过增加密码哈希的复杂性,防止彩虹表攻击和暴力破解,使得密码存储更加安全。

相关文章:

  • 解决Microsoft Edge浏览器无法使用英文翻译功能
  • 定个小目标之刷LeetCode热题(28)
  • 孕妈妈如何高效备考PMP,纯经验分享
  • Vue核心指令解析:探索MVVM与数据操作之美
  • SpringBoo+vue3+vite整合讯飞星火3.5通过webscoket实现聊天功能(前端代码)附带展示效果
  • Python爬虫-贝壳新房
  • (一)Kafka 安全之使用 SASL 进行身份验证 —— JAAS 配置、SASL 配置
  • 在线随机密码生成工具
  • 制作微信小程序“飞翔的小鸟”
  • 【Redis】如何保证缓存和数据库的一致性
  • Vue发送http请求
  • 计算机网络之TCP的三次握手和四次挥手
  • webpack 中 require.context() 的用法
  • 力扣刷题笔记
  • Redis连接池配置:深入探索JedisPoolConfig
  • .pyc 想到的一些问题
  • 【腾讯Bugly干货分享】从0到1打造直播 App
  • 【跃迁之路】【477天】刻意练习系列236(2018.05.28)
  • django开发-定时任务的使用
  • ES6--对象的扩展
  • java2019面试题北京
  • JavaScript 事件——“事件类型”中“HTML5事件”的注意要点
  • javascript从右向左截取指定位数字符的3种方法
  • Javascript基础之Array数组API
  • JS创建对象模式及其对象原型链探究(一):Object模式
  • JS学习笔记——闭包
  • Python进阶细节
  • Python学习之路16-使用API
  • React Native移动开发实战-3-实现页面间的数据传递
  • Redis 懒删除(lazy free)简史
  • Spark in action on Kubernetes - Playground搭建与架构浅析
  • Xmanager 远程桌面 CentOS 7
  • 测试如何在敏捷团队中工作?
  • 欢迎参加第二届中国游戏开发者大会
  • 技术发展面试
  • 解决iview多表头动态更改列元素发生的错误
  • 浅谈Golang中select的用法
  • 融云开发漫谈:你是否了解Go语言并发编程的第一要义?
  • 实战:基于Spring Boot快速开发RESTful风格API接口
  • 线上 python http server profile 实践
  • 用简单代码看卷积组块发展
  • 【运维趟坑回忆录 开篇】初入初创, 一脸懵
  • ​configparser --- 配置文件解析器​
  • ​创新驱动,边缘计算领袖:亚马逊云科技海外服务器服务再进化
  • # 深度解析 Socket 与 WebSocket:原理、区别与应用
  • $.extend({},旧的,新的);合并对象,后面的覆盖前面的
  • $LayoutParams cannot be cast to android.widget.RelativeLayout$LayoutParams
  • (1)svelte 教程:hello world
  • (70min)字节暑假实习二面(已挂)
  • (BAT向)Java岗常问高频面试汇总:MyBatis 微服务 Spring 分布式 MySQL等(1)
  • (MIT博士)林达华老师-概率模型与计算机视觉”
  • (Redis使用系列) Springboot 在redis中使用BloomFilter布隆过滤器机制 六
  • (汇总)os模块以及shutil模块对文件的操作
  • (剑指Offer)面试题34:丑数
  • (接口自动化)Python3操作MySQL数据库