C# 常用密码加密与解密技术完全指南
目录
-
密码安全的核心概念
-
加密 vs 哈希:何时使用?
-
密钥管理的重要性
-
常见攻击手段(中间人攻击、彩虹表)
-
-
基础加密技术
-
对称加密(AES)
-
非对称加密(RSA)
-
哈希算法(SHA3、HMAC)
-
-
现代安全实践
-
密码存储方案(PBKDF2、BCrypt)
-
数据保护API(Microsoft DPAPI)
-
安全随机数生成(CSPRNG)
-
-
代码实战
-
AES加密解密完整流程
-
RSA密钥对生成与加密
-
使用BCrypt安全存储密码
-
-
安全陷阱与防御
-
不要使用ECB模式!
-
密钥硬编码的风险
-
防止Padding Oracle攻击
-
-
企业级解决方案
-
Azure Key Vault集成
-
硬件安全模块(HSM)
-
-
常见问题解答
1. 密码安全的核心概念
加密 vs 哈希
特性 | 加密 | 哈希 |
---|---|---|
可逆性 | 是 | 否 |
适用场景 | 数据传输(如信用卡号) | 密码存储 |
典型算法 | AES、RSA | SHA3、PBKDF2、BCrypt |
密钥管理三原则
-
保密性:主密钥必须安全存储(如HSM)
-
轮换策略:定期更换加密密钥
-
最小权限:按需分配密钥访问权限
2. 基础加密技术
AES对称加密(CBC模式示例)
using System.Security.Cryptography;public class AesHelper
{public static (string cipherText, string iv) Encrypt(string plainText, byte[] key){using Aes aes = Aes.Create();aes.Key = key;aes.Mode = CipherMode.CBC; // 必须使用CBC或GCM模式aes.Padding = PaddingMode.PKCS7;// 生成随机IV(16字节)aes.GenerateIV();byte[] iv = aes.IV;ICryptoTransform encryptor = aes.CreateEncryptor();byte[] encrypted;using (var ms = new MemoryStream()){using (var cs = new CryptoStream(ms, encryptor, CryptoStreamMode.Write)){byte[] plainBytes = Encoding.UTF8.GetBytes(plainText);cs.Write(plainBytes, 0, plainBytes.Length);}encrypted = ms.ToArray();}return (Convert.ToBase64String(encrypted), Convert.ToBase64String(iv));}public static string Decrypt(string cipherText, byte[] key, string ivBase64){using Aes aes = Aes.Create();aes.Key = key;aes.IV = Convert.FromBase64String(ivBase64);aes.Mode = CipherMode.CBC;aes.Padding = PaddingMode.PKCS7;ICryptoTransform decryptor = aes.CreateDecryptor();byte[] cipherBytes = Convert.FromBase64String(cipherText);using (var ms = new MemoryStream(cipherBytes))using (var cs = new CryptoStream(ms, decryptor, CryptoStreamMode.Read))using (var sr = new StreamReader(cs)){return sr.ReadToEnd();}}
}
RSA非对称加密
using System.Security.Cryptography;public class RsaHelper
{// 生成2048位密钥对public static (string publicKey, string privateKey) GenerateKeyPair(){using RSA rsa = RSA.Create(2048);return (Convert.ToBase64String(rsa.ExportRSAPublicKey()),Convert.ToBase64String(rsa.ExportRSAPrivateKey()));}public static string Encrypt(string plainText, string publicKeyBase64){byte[] publicKey = Convert.FromBase64String(publicKeyBase64);using RSA rsa = RSA.Create();rsa.ImportRSAPublicKey(publicKey, out _);byte[] encrypted = rsa.Encrypt(Encoding.UTF8.GetBytes(plainText), RSAEncryptionPadding.OaepSHA256);return Convert.ToBase64String(encrypted);}public static string Decrypt(string cipherText, string privateKeyBase64){byte[] privateKey = Convert.FromBase64String(privateKeyBase64);using RSA rsa = RSA.Create();rsa.ImportRSAPrivateKey(privateKey, out _);byte[] decrypted = rsa.Decrypt(Convert.FromBase64String(cipherText), RSAEncryptionPadding.OaepSHA256);return Encoding.UTF8.GetString(decrypted);}
}
3. 现代安全实践
密码存储方案(PBKDF2 + Salt)
using System.Security.Cryptography;public class PasswordHasher
{// 生成密码哈希(推荐参数)public static (string hash, string salt) HashPassword(string password){byte[] salt = new byte[32];using var rng = RandomNumberGenerator.Create();rng.GetBytes(salt);int iterations = 150000; // OWASP 2021推荐值using var pbkdf2 = new Rfc2898DeriveBytes(password,salt,iterations,HashAlgorithmName.SHA512);byte[] hash = pbkdf2.GetBytes(64); // 64字节=512位return (Convert.ToBase64String(hash),Convert.ToBase64String(salt));}// 验证密码public static bool VerifyPassword(string password, string storedHash, string storedSalt){byte[] salt = Convert.FromBase64String(storedSalt);byte[] hash = Convert.FromBase64String(storedHash);using var pbkdf2 = new Rfc2898DeriveBytes(password,salt,150000,HashAlgorithmName.SHA512);byte[] testHash = pbkdf2.GetBytes(64);return CryptographicOperations.FixedTimeEquals(hash, testHash);}
}
Microsoft数据保护API(DPAPI)
// 适合本地数据保护(自动管理密钥)
using Microsoft.AspNetCore.DataProtection;public class DataProtector
{private readonly IDataProtector _protector;public DataProtector(IDataProtectionProvider provider){_protector = provider.CreateProtector("AppName.Purpose");}public string Protect(string input) => _protector.Protect(input);public string Unprotect(string protectedData) => _protector.Unprotect(protectedData);
}
4. 安全陷阱与防御
AES加密的致命错误
// 错误示例:使用ECB模式(不安全的!)
aes.Mode = CipherMode.ECB; // ❌ 相同输入产生相同输出,易被分析// 正确做法:使用CBC或GCM模式
aes.Mode = CipherMode.CBC; // ✅ 需要随机IV
aes.GenerateIV(); // 每次加密生成新IV
密钥存储的典型错误
// 错误:硬编码密钥
byte[] key = Encoding.ASCII.GetBytes("ThisIsASecretKey123"); // ❌// 正确:从安全存储获取
byte[] key = Convert.FromBase64String(ConfigurationManager.AppSettings["EncryptionKey"] // ✅ 使用密钥库
);
5. 企业级解决方案
Azure Key Vault集成
using Azure.Security.KeyVault.Keys.Cryptography;public async Task<string> EncryptWithAzureKeyVault(string text)
{var credential = new DefaultAzureCredential();var cryptoClient = new CryptographyClient(new Uri("https://your-vault.vault.azure.net/keys/key-name/"),credential);byte[] data = Encoding.UTF8.GetBytes(text);EncryptResult result = await cryptoClient.EncryptAsync(EncryptionAlgorithm.RsaOaep, data);return Convert.ToBase64String(result.Ciphertext);
}
6. 常见问题解答
Q1:应该选择对称还是非对称加密?
-
对称加密(AES):速度快,适合大数据量(如文件加密)
-
非对称加密(RSA):适合密钥交换或小数据加密
Q2:如何安全存储加密密钥?
-
开发环境:使用
dotnet user-secrets
-
生产环境:Azure Key Vault/AWS KMS/HSM
Q3:加密后的数据如何比较?
-
使用固定时间比较函数防止时序攻击:
// 正确方式 CryptographicOperations.FixedTimeEquals(hash1, hash2);// 错误方式 if (hash1 == hash2) { ... } // ❌ 可能泄露比较时间
Q4:如何迁移旧加密系统?
-
解密旧数据(使用旧密钥)
-
用新算法/密钥重新加密
-
销毁旧密钥(物理安全)
相关文章:
C# 常用密码加密与解密技术完全指南
目录 密码安全的核心概念 加密 vs 哈希:何时使用? 密钥管理的重要性 常见攻击手段(中间人攻击、彩虹表) 基础加密技术 对称加密(AES) 非对称加密(RSA) 哈希算法(SH…...
C++ QT 与 win32 窗口可以互操作
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow) {ui->setupUi(this);this->setWindowTitle("天下第一剑"); // HWND hwnd FindWindow(L"天下第一剑",L"天下第一剑"); // qDebug()<<…...
MySQL--day4--排序与分页
(以下内容全部来自上述课程) 1. 排序数据 1.1 排序基本使用 #1.排序 #如果没有使用排序操作,默认情况下查询返回的数据是按照添加数据的顺序显示的 SELECT * FROM employees;# 练习:按照salary从高到低的顺序显示员工信息 # 使用 ORDER …...
文件操作和IO—初识文件
认识文件 狭义上的文件(file),是针对硬盘这种持久化存储的IO设备,当我们想要进行数据保存的时候,往往不是保存成一个整体,而是独立成一个个的单位进行保存,这个独立的单位就被抽象成文件的概念…...
P2670 [NOIP 2015 普及组] 扫雷游戏
P2670 [NOIP 2015 普及组] 扫雷游戏 - 洛谷 #include<bits/stdc.h> using namespace std; int n,m; char a[105][105]; int main(){cin>>n>>m;for(int i1;i<n;i){for(int j1;j<m;j){cin>>a[i][j];}}for(int i1;i<n;i){for(int j1;j<m;j){…...
HomeAssistant开源的智能家居docker快速部署实践笔记(CentOS7)
1. SGCC_Electricity 应用介绍 SGCC_Electricity 是一个用于将国家电网(State Grid Corporation of China,简称 SGCC)的电费和用电量数据接入 Home Assistant 的自定义集成组件。通过该应用,用户可以实时追踪家庭用电量情况&…...
02 基本介绍及Pod基础排错
01 yaml文件里的字段错误 # 多打了一个i导致的报错 [rootmaster01 yaml]# cat 01-pod.yaml apiVersion: v1 kind: Pod metadata:name: likexy spec:contaiiners:- name: aaaimage: registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v1 [rootmaster01 yaml]# kubectl …...
9 定时任务与周期性调度
一、定时任务核心机制 1.1 基础调度配置 # celery.py from celery import Celery from celery.schedules import crontabapp Celery(proj) app.conf.beat_schedule {daily-report: {task: report.generate,schedule: crontab(hour3, minute30), # 每天3:30执行args: (),op…...
macOS 效率工具对比分析:Raycast、Alfred、uTools、Spotlight
macOS 效率工具对比分析:Raycast、Alfred、uTools、Spotlight 对比分析四款常见 macOS 高效工具,涵盖功能、插件生态、开发者支持、适用人群等维度,帮助你选择最适合自己的效率助手。 🔍 一、基本介绍 工具名简介SpotlightmacOS …...
接口测试速成指南:基础知识+工具使用全解析
你是否也有这样的经历:项目初期接口文档混乱,测试人员无从下手;开发说接口OK,测试却频繁遇坑?别怕,接口测试并没你想得那么难! “接口测试怎么做?用什么工具?”面试官一…...
SpringSecurity基础入门
一个身份认证、授权、防御常见攻击的框架。 spring security 中文网:Spring Security中文网 自定义配置 基于内存的用户认证 实现步骤如下: 在配置类中创建security的配置类: Configuration //声明当前类为配置类 EnableWebSecurity //…...
MySQL的安装及相关操作
目录 一. 数据库产生的背景 二. 数据库操作系统的组成 2.1 数据库(Database) 2.2 数据库管理系统(DBMS, Database Management System) 2.3 应用程序(Application) 三. 数据库的分类 3.1 关系数据库 3.2 非关系数据库 四. MySQL安装 4.1yum安装 1. Ubuntu 2. cent…...
【Code】Foundations 2017- Catalogue, List of Tables, List of Figures
Foundations 2017 目录 | Catalogue表格目录 | List of Tables图表目录 | List of Figures 目录 | Catalogue 英文原文中文翻译词汇学习(音标和解释)1. General1. 总则1.1 Scope1.1 范围1.2 Glossary1.2 术语表Glossary [ˈɡlɒsəri] 术语表ÿ…...
【TCGA-CRC】TCGA数据读取
写在前面 参考已有的帖子写的,但是临床数据和UCSC的不同。有知道的小伙伴欢迎指正。 rm(list ls()); gc() test1 data.table::fread("./00_Rawdata/GDCdata/TCGA-COAD/Transcriptome_Profiling/Gene_Expression_Quantification/00ae9ab8-6eaa-4085-af72-26…...
BYUCTF 2025
几周没会的比赛了,都是一题游。这周的BYU还不错,难度适中,只是时间有点短。周末时间不够。 Crypto Many Primes from Crypto.Util.number import bytes_to_long, getPrime import randomflag open("flag.txt").read().encode()…...
【Linux】初见,基础指令(续)
前言: 上文讲解了部分指令,本文我们来讲解剩下的指令【Linux】初见,基础指令-CSDN博客 cat指令 语法:cat 选项 文件 功能:打印文件中的内容 选项: -b 对非空行输出进行编号 -n 对输出的说有行进行编号…...
《MambaLLIE:基于隐式Retinex感知的低光照增强框架与全局-局部状态空间建模》学习笔记
Paper:2405.16105 Github:GitHub - wengjiangwei/MambaLLIE 目录 摘要 一、介绍 二、相关工作 2.1 低光图像增强 2.2 视觉空间状态模型 三、方法 3.1 预备知识 3.2 整体流程 3.3 全局优先-局部次之状态空间块 四、实验 4.1 基准数据集与实施细节 4.2 对比实验 4…...
计算机图形学Games101笔记--几何
第二部分:几何 几何介绍 光栅化解决如何渲染,几何研究模型如何存储在GPU的内存中。几何主要分为两种:隐式几何和显式几何。 **隐士几何:**用点之间的关系存储,如球的计算公式。更一般的可以用f(x,y,z)。我们可以令f…...
Web开发-Python应用Flask框架Jinja模版绑定路由参数传递页面解析SSTI注入
知识点: 1、安全开发-Python-Flask&Jinja2 2、安全开发-Python-路由传参&SSTI注入 演示案例-WEB开发-Python-Flask框架&Jinja2模版&路由传参&SSTI注入 0、Pycharm 配置Python解析 新建Flask项目 1、路由传参 app.route(/) app.route(/<id…...
聚焦开放智能,抢占技术高地 | 2025 高通边缘智能创新应用大赛第五场公开课来袭!
随着2025高通边缘智能创新应用大赛的推进,越来越多的参赛者关注如何借助高性能硬件突破技术瓶颈、打造差异化作品。 5月27日晚8点,大赛将开启初赛阶段的第五场专题公开课——由美格软件研究院院长李书杰领衔,深入解析高通平台的底层架构与参…...
NMOS和PMOS的区别
1 区分NMOS和PMOS:衬底箭头指向G级的是NMOS,衬底箭头背向G级的是PMOS 2 区分D和S级:针对NMOS,体二极管的正方向为S级;针对PMOS,体二极管正的方向为D级 3 区分电流方向:针对NMOS,电…...
Paillier加密方案的原理、实现与应用(vs)
一、实验目的 1、掌握NTL的基本配置和方法(以下是以visualstudio为例) 2、掌握Paillier加密方案的原理与实现 ①钥匙生成:首先,生成一把钥匙,包括钥匙和私钥匙。钥匙由两个大素数(p,q)的乘积n和一个整数g组成&#…...
Metal入门,使用Metal绘制3D图形
这次是使用Metal绘制一个立方体,并且添加旋转效果,绘制正方形的步骤很简单,我们绘制一个正方形就相当于绘制两个三角形,那么绘制一个正方体,我们很容易想到需要绘制他六个面,很显然,我们也需要把…...
Java 04 API
API 简介 一些已经写好的应用程序编程接口Object toString 默认返回的是当前对象在堆内存中的地址值信息:类的全类名十六进制哈希值返回该对象的返回值 class A{ } //返回的是地址哦 String sA.toString(); //细节:使用打印语句,打印对象…...
基于Gitee 的开发分支版本管理规范
一、版本管理规范概述 目的:规范代码分支管理和版本发布流程,提高团队协作效率,确保代码质量和版本可追溯性。适用范围:基于 Gitee 平台开发的所有项目。分支策略:采用 Git Flow 模型的变体,主要分支包括 …...
HOW - 结合 AI 进行 Tailwind 样式开发
文章目录 情况 1:使用 Tailwind CSS 与手写传统 CSS 的开发效率对比情况 2:AI Tailwind 自动生成 UI 的效率如何?总结 在 WHAT - Tailwind 样式方案(不写任何自定义样式) 中我们已经简单介绍过 Tailwind。今天主要认识…...
系统数据对接-从获取到处理的全流程
在后端架构的复杂生态中,子系统间或与外部系统的对接是常态,其核心要义在于实现数据的精准传输。本文聚焦于数据传输后的运算逻辑与异常处理机制,旨在为后端开发者提供深度见解。 一、数据获取机制:触发式与定时任务的权衡 &…...
Java 09Stream流与File类
Stream流与File类 Stream流 简化集合和数组的操作,startWith(“张”) 第一个为这个返回true String1.获取Stream对象 单列集合 双列集合 先获得键值对 在遍历数组 零散的数据 Stream<Integer> arrStream.of(1,2,34,3); stream.forEach(sss); 即可2.中间…...
《光与影:33号远征队》栩栩如生的角色动画是如何创建的?
《光与影:33号远征队》是一款由Sandfall Interactive公司开发的回合制RPG游戏,背景是一个黑暗的幻想世界。游戏因其独特的艺术风格和引人注目的叙事赢得了无数赞誉,成为今年大热游戏中的一匹黑马。 在该游戏制作中Sandfall依靠包括Xsens在内的…...
GESP2024年12月认证C++二级( 第三部分编程题(1)寻找数字)
参考程序(枚举): #include <iostream> //#include <cmath> using namespace std;int main() {int t;cin >> t;while (t--) {long long a;cin >> a;bool found false;// 枚举 b for (long long b 1; b * b * b * b…...
《探索具身智能机器人视觉-运动映射模型的创新训练路径》
视觉 - 运动映射模型作为实现智能交互与精准行动的核心,吸引着全球科研人员与技术爱好者的目光。这一模型就像机器人的 “神经中枢”,连接着视觉感知与肢体运动,使机器人能够在复杂的现实环境中灵活应对各种任务。 传统的视觉 - 运动映射模型…...
Python打卡DAY31
今日的示例代码包含2个部分 notebook文件夹内的ipynb文件,介绍下今天的思路项目文件夹中其他部分:拆分后的信贷项目,学习下如何拆分的,未来你看到的很多大项目都是类似的拆分方法 知识点回顾 规范的文件命名规范的文件夹管理机器学…...
【SPIN】PROMELA远程引用与控制流验证(SPIN学习系列--5)
PROMELA语言提供了两种强大的机制用于验证并发系统:远程引用(remote references)和进程变量引用。这些机制使得在不引入额外状态变量的情况下,能够精确描述系统状态和属性。 远程引用(Remote References) 远程引用允许你直接引用进程中的控制位置(labe…...
GMSL:汽车里的音视频传输
参考链接: blog.csdn.net/weixin_50875614/article/details/119995651 blog.csdn.net/syjie19900426/article/details/145269782 SerDes 应用场景 WHAT GMSL是什么 GMSL(Gigabit Multimedia Serial Links),中文名称为千兆多媒体串行链路,是Maxim公司推出的一种…...
Java并发进阶系列:深度讨论jdk1.8 ConcurrentHashMap并发环境下transfer方法桶位分配过程
在前面有多篇关于jdk1.8的ConcurrentHashMap研究是基于源代码给出的深度分析,要知道多线程环境下的ConcurrentHashMap内部运行机制是相对复杂的,好在IDEA提供的相关断点和Debug功能确实好用,使得多线程调试起来直观,通过这种方式能…...
【深度学习-Day 14】从零搭建你的第一个神经网络:多层感知器(MLP)详解
Langchain系列文章目录 01-玩转LangChain:从模型调用到Prompt模板与输出解析的完整指南 02-玩转 LangChain Memory 模块:四种记忆类型详解及应用场景全覆盖 03-全面掌握 LangChain:从核心链条构建到动态任务分配的实战指南 04-玩转 LangChai…...
fdisk和parted的区别
在Linux系统中,fdisk和parted是两种常用的分区工具。虽然它们都可以对硬盘进行分区,但在功能和适用范围上有显著的区别。 fdisk fdisk主要用于MBR(主引导记录)分区表的管理。MBR分区表有以下特点: 支持小于2TB的硬盘…...
springMVC拦截器,拦截器拦截策略设置
目录 1、MyInterceptor1 2、UserController 3、MvcConfig,拦截器4种拦截方法策略 做请求的校验,如果校验没有通过,直接返回,原来下面的处理,就不用处理了 将request进行拦截校验 将response进行拦截校验 preHandle…...
如何测试北斗卫星通讯终端的性能?
测试北斗卫星通讯终端的性能需从功能、性能、环境适应性、可靠性等多维度展开,以下是具体测试内容与方法: 一、基础功能测试 验证终端是否满足北斗系统的核心通讯功能。 (1)通信模式测试 短报文通信 测试终端发送 / 接收短报…...
基于MakeReal3D的虚拟预装系统:飞机装配效率与精度的双重突破
在航空制造领域,飞机部件的对接装配是飞机制造过程中的关键环节。传统的部件装配方式高度依赖操作人员的经验和反复调整,调姿过程耗时较长,且难以保证每次装配都能达到最优状态。随着虚拟现实技术的成熟,虚拟装配技术作为一种新兴…...
IP54是什么?
IP54是什么 定义 IP54是一种国际标准,用来指示设备的防护等级,该标准由国际电工委员会(IEC)制定,并在许多领域广泛使用13。IP是Ingress Protection的缩写,IP等级是针对电气设备外壳对异物侵入的防护等级。…...
Python异步编程详解
Python异步编程详解 引言 异步编程是Python中处理并发操作的重要方式,它允许程序在等待I/O操作时执行其他任务,从而提高程序的整体效率。本文将详细介绍Python异步编程的概念、实现方式以及实际应用场景。 1. 异步编程基础 1.1 什么是异步编程&#x…...
AUC与Accuracy的区别
下面分别解释下这两句话的含义及其原因,并说明 AUC 与 Accuracy(准确率)的区别: AUC 是阈值无关的指标 • 含义:在二分类问题中,模型通常会输出一个概率值或打分,需要设定一个阈值来将这些概…...
差分数组:原理与应用
一、什么是差分数组 差分数组是一种高效处理区间更新操作的数据结构技巧,特别适用于需要对数组的某个区间进行频繁增减操作的场景。差分数组的核心思想是通过存储相邻元素的差值而非元素本身,将区间操作转化为端点操作,从而将时间复杂度从O(…...
一些C++入门基础
关键字 图引自 C 关键词 - cppreference.com 命名空间 命名空间解决了C没办法解决的各类命名冲突问题 C的标准命名空间:std 命名空间中可以定义变量、函数、类型: namespace CS {//变量char cs408[] "DS,OS,JW,JZ";int cs 408;//函数vo…...
免费插件集-illustrator插件-Ai插件-路径尖角圆角化
文章目录 1.介绍2.安装3.通过窗口>扩展>知了插件4.功能解释5.总结 1.介绍 本文介绍一款免费插件,加强illustrator使用人员工作效率,实现图形编辑中路径尖角圆角化。首先从下载网址下载这款插件https://download.csdn.net/download/m0_67316550/87…...
数据分析_商务运营考核指标体系搭建
以抖音电商中的小学教辅书籍业务为例,搭建对接达人的商务运营团队能力考核指标体系,涵盖达人筛选、合作管理、效果追踪和长期价值维护等核心环节,结合教育产品特性和商务运营目标,设计分层量化指标: 一、考核目标 围绕…...
基于Java的校运会管理系统【附源码】
湄洲湾职业技术学院 毕业设计(论文) 课题名称: 系 别: 专 业: 年 级: 姓 名: 学 号: 指导教师: 摘 要 用传统的方式来管理信息,一是耗时较长,二是…...
保证数据库 + redis在读写分离场景中事务的一致性
在 Spring Boot 中实现数据库与 Redis 的一致性,特别是处理读写分离时,确保数据修改的事务一致性是一个常见的挑战。因为 Redis 是一个内存数据库,通常用于缓存,而关系型数据库是持久化存储,两者之间的数据同步和一致性…...
【Redis】跳表结构
目录 1、背景2、跳表【1】底层结构【2】关键操作【3】redis使用跳表原因【4】特性 1、背景 redis中的跳表是一种有序数据结构,主要用于实现有序集合(zset)。跳表通过多级索引实现高效查找(平均O(logN)时间复杂度)&…...