zl程序教程

您现在的位置是:首页 >  后端

当前栏目

c#加密:一、加密概述和windows数据保护

c#Windows加密 概述 数据保护
2023-09-14 09:15:03 时间

一、c#加密方式概览

密钥数量速度强度备注
File.Encrypt0由用户密码确定在文件系统支持下透明地保护文件内容 。密钥是隐式从登录用户的凭据中得到的。
windows数据保护0由用户密码确定使用隐式生成的密钥对字节数组进行加密和解密 。
散列0单向 (不可逆的) 转换 。用于存储密码 ,对比文件以及检查数据错误 。
对称加密1用于普通的加密/解密。使用相同的密钥进行加密或解密 。 可用于保护传输中的信息 。
公钥加密2使用不同的密钥进行加密和解密。用于交换传输消息中的对 称加密密钥,或用于文件的数字签名 。

        .NET Framework中System.Security.Cryptography.Xml命名空间内的类型对创建和验证基于XML的签名提供了支持。同时System.Security.Cryptography.X509Certificates命名空间对数字证书提供了支持。

二、windows数据保护

1、File.Encrypt(String) 方法

        File.Encrypt方法是将某个文件加密,使得只有加密该文件的帐户才能将其解密。

        使用这个方法,可以对Encrypt文件进行加密,以便只有用于调用此方法的windows帐户才能对文件进行解密。 使用 Decrypt 方法对方法加密的文件进行解密 Encrypt 。

        查看微软的方法说明。

File.Encrypt(String) 方法 (System.IO) | Microsoft Docsicon-default.png?t=LBL2https://docs.microsoft.com/zh-cn/dotnet/api/system.io.file.encrypt?view=net-6.0&viewFallbackFrom=net-7.0        微软官方提示:

只有能够使用 NTFS 加密文件系统 (EFS) 的 Windows 平台才支持此 API。 在非 Windows 系统、Windows Home Edition 系统或非 NTFS 驱动器上使用此项的任何尝试都会导致 PlatformNotSupportedException 或 NotSupportedException ,具体取决于情况。
不建议在 .NET Core 中使用此 API;包含它是为了实现移动到 .NET Core 但仍显式面向 Windows 的应用程序的可移植性。

        参考代码如下。

File.WriteAllText("text_file1.txt", "");
File.Encrypt("text_file1.txt");
File.AppendAllText("text_file1.txt", "小猫咪abc");

        运行代码会生成如下图带锁的文件。

         并且windows会弹出如下提示让备份密码,免得windows系统或账户出现问题,文件永久访问不了的情况。

         点击这个提示,会弹出如下窗口,可以根据自己的情况考虑是否备份,如果取消掉,则重启电脑后在操作会再次给出提醒。

2、Windows数据保护API

        File.Encrypt中加密使用的密钥是用当前登录用户的密码生成的。这种隐式生成的密钥还可以结合Windows数据保护API对字节数组进行加密。数据保护API定义在Protected-Data类中。该类型中只有两个静态方法:

public unsafe static byte[] Protect(byte[] userData, byte[] optionalEntropy, DataProtectionScope scope)
public unsafe static byte[] Unprotect(byte[] encryptedData, byte[] optionalEntropy, DataProtectionScope scope)

        optionalEntropy参数中的数据会添加到密钥中,从而增强其安全性。而Data-ProtectionScope枚举参数可以选择CurrentUser或者LocalMachine。若使用CurrentUser则密钥会从当前登录用户的凭据中生成;若使用LocalMachine,则会使用一个本机范围的密钥,而该密钥对所有用户都是共享的。因此LocalMachine的密钥提供的保护相对较弱。但这种方式适用于Windows服务或那些可能运行在不同账户下的应用程序。

        代码示例:

byte[] data = { 25, 36, 44, 5, 6 };
byte[] entropy = { 25, 1 };
byte[] encrypted = System.Security.Cryptography.ProtectedData.Protect(data, entropy, System.Security.Cryptography.DataProtectionScope.CurrentUser);
byte[] temp = System.Security.Cryptography.ProtectedData.Unprotect(encrypted, entropy, System.Security.Cryptography.DataProtectionScope.CurrentUser);

        Windows数据保护可以在攻击者获得计算机完全访问权限后仍提供中等程度的安全保护。而保护的强度取决于用户密码的强度。LocalMachine只能够防范那些获得了有限的物理或电子访问权限的攻击者。