在.NET Framework出现之前,如果我们需要进行加密的话,我们只有各种较底层的技术可以选择,如Microsoft Crypto API、Crypto++、Openssl等等,其用法相当复杂。而在 .NET Framework中,这些复杂内容(原来独立的API和SDK)已经被封装合并在一个.NET框架类中,这对于程序开发人员非常有利。它将CryptoAPI改编进.NET的System.Security.Cryptography命名空间,使其包含这些与加密、签名相关的类。利用这些类,我们就可以很方便地使用各种广泛使用的算法,包括RSA, DSA, Rijndael,** SHA和其他Hash算法**等等。,使密码服务摆脱了SDK平台的神秘性,变成了简单的.NET名字空间的使用。
System.Security.Cryptography.Algorith
加密算法主要分为:对称加密算法、非对称加密算法和散列算法(哈希算法)
1.对称密钥密码算法:
对称密钥密码算法所用的加密密钥和解密密钥通常是相同的,即使不同也可以很容易地由其中的任意一个推导出另一个。在此算法中,对密钥的保密性在这类应用中的重中之重!加、解密双方所用的密钥都要保守秘密。由于计算速度快,对称加密算法被广泛应用于大量数据,如文件的加密过程中。
对称加密要注意的地方主要就是块加密模式(这个也不是对称独有的,在非对称中也存在模式概念)!
使用分组密码算法数字签名常用的加密标准有:DES,Tripl-DES,RC2,RC4,CAST等。
2.非对称加密算法
非对称密钥密码算法又称公共钥匙加密算法,意指加解密的密钥是不一样的,使用到两个密钥:公开密钥和私有密钥,数据加密一个,数据解密一个!即如果用公开密钥对数据进行加密,只有用对应的私有密钥才能进行解密;如果用私有密钥对数据进行加密,则只有用对应的公开密钥才能解密。加密方式的安全性要比对称的安全些,但安全不是绝对的!这种算法最主要运用场景就是数字签名!像RSA/DSA!
使用公钥密码算法进行数字签名通用的加密标准有: RSA,DSA等。
3.加密哈希算法(散列算法)
哈希算法也称作散列算法或报文摘要(digital digest)。哈希算法将任意长度数据转化为固定长度字符序列。简单点就是一种变换,使变换后的数据在一定小概率情况下代表变换前数据的“标签”,这个标签就是散列,变换就是散列算法,往往这些算法是公开的、不可逆的!因为算法公开的,为了防止大家谁都可以对源数据进行散列,所以出现增加一个KEY的变形散列算法(HMAC算法)。哈希结果是始终维一的。任意二个序列的哈希结果是不同的。哈希结果亦称为数字指纹(Finger Print),它有固定的长度,且相同的明文摘要必定一致。这样这串摘要使可成为验证明文是否是"真身"的"指纹"了。
散列主要用在对数据有效性的验证方面。例如,BT就是用SHA1验证收到数据块是否有效的,Email服务器的登录就有一中名为HMACMD5的验证模式!
特点:
- 算法公开,散列的算法是公开的,也就是说谁都可以通过算法进行输入散列化。
- 信息指纹,对相同的输入信息进行散列,得到的结果是一致的(这也是信息指纹的由来)。
- 不可逆 (将一个已经被散列的输出无法通过计算还原原本的输入)。tag:但是现在也有网上通过大数据收集已有的散列,进行库存储,可以通过查库得到原本的输入。
- 定长,对不同长度的输入信息进行散列,得到的输出永远是定长的(128个二进制位,32个十六进制字符)。
作用:
-
对于用户敏感信息的保密.(比如用户密码)
tag:把一些不方便明文展示的用户隐私信息通过散列进行密文隐藏,这样被窃取后不会导致隐私泄露。 -
搜索引擎
tag:在搜索引擎中,搜索引擎会进行猜词搜索,就是取搜索词汇中的关键字进行hash匹配,如果匹配结果一致,就显示相应的搜索结果。 -
版权维护
tag:将正版的文件进行hash存储作为正版标识。当有用户进行文件上传时,检测文件的hash值与库中的hash进行匹配,如果不一致,则是侵权行为。 -
数字签名
tag:这在支付领域中用的相当频繁,由于通常网络数据并不小,直接对数据进行RSA加密,这是相当吃性能的行为,那么通常我们就将数据进行hash散列,得到固定的输出数据,再进行加密,这一部分被加密的hash散列数据就是数据的数字签名。通常我们将这个签名信息对原始数据的hash进行匹配识别,以防止数据被篡改。
哈希算法数字签字通用的加密标准有: SHA-1,MD5等。
使用方法:
1.Nuget中引用 System.Security.Cryptography.Algorith
2.新建工具类Securityhelper
public class SecurityHelper
{
#region md5加密
/// <summary>
/// MD5 16位加密,不可逆
/// </summary>
/// <param name="password"></param>
public static string MD5Encrypt16Bit(string password)
{
MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
string str = BitConverter.ToString(md5.ComputeHash(Encoding.UTF8.GetBytes(password)), 4, 8);
str = str.Replace("-", "");
return str;
}
/// <summary>
/// MD5 32位加密,不可逆
/// </summary>
/// <param name="password"></param>
public static string MD5Encrypt32Bit(string password)
{
string pwd = "";
System.Security.Cryptography.MD5 md5 = System.Security.Cryptography.MD5.Create();
byte[] str = md5.ComputeHash(Encoding.UTF8.GetBytes(password));
for (int i = 0; i < str.Length; i++) // 通过使用循环,将字节类型的数组转换为字符串,此字符串是常规字符格式化所得
pwd = pwd + str[i].ToString("X"); // 将得到的字符串使用十六进制类型格式。格式后的字符是小写的字母,如果使用大写(X)则格式后的字符是大写字符
return pwd;
}
/// <summary>
/// MD5 64位加密,不可逆
/// </summary>
/// <param name="password"></param>
public static string MD5Encrypt64Bit(string password)
{
System.Security.Cryptography.MD5 md5 = System.Security.Cryptography.MD5.Create();
byte[] str = md5.ComputeHash(Encoding.UTF8.GetBytes(password));
return Convert.ToBase64String(str);
}
#endregion
#region
/// <summary>
/// SHA-1
/// </summary>
/// <param name="str"></param>
public static string SHA_1(string str)
{
System.Security.Cryptography.SHA1CryptoServiceProvider SHA1CSP =
new System.Security.Cryptography.SHA1CryptoServiceProvider();
byte[] bytValue = System.Text.Encoding.UTF8.GetBytes(str);
byte[] bytHash = SHA1CSP.ComputeHash(bytValue);
SHA1CSP.Clear();
string hashstr = "", tempstr = "";
for (int counter = 0; counter < bytHash.Length; counter++)
{
long i = bytHash[counter] / 16;
if (i > 9)
tempstr = ((char)(i - 10 + 0x41)).ToString();
else
tempstr = ((char)(i + 0x30)).ToString();
i = bytHash[counter] % 16;
if (i > 9)
tempstr += ((char)(i - 10 + 0x41)).ToString();
else
tempstr += ((char)(i + 0x30)).ToString();
hashstr += tempstr;
}
return hashstr;
}
/// <summary>
/// SHA-256
/// </summary>
/// <param name="str"></param>
public static string SHA_256(string str)
{
System.Security.Cryptography.SHA256CryptoServiceProvider SHA256CSP =
new System.Security.Cryptography.SHA256CryptoServiceProvider();
byte[] bytValue = System.Text.Encoding.UTF8.GetBytes(str);
byte[] bytHash = SHA256CSP.ComputeHash(bytValue);
SHA256CSP.Clear();
string hashstr = "", tempstr = "";
for (int counter = 0; counter < bytHash.Length; counter++)
{
long i = bytHash[counter] / 16;
if (i > 9)
tempstr = ((char)(i - 10 + 0x41)).ToString();
else
tempstr = ((char)(i + 0x30)).ToString();
i = bytHash[counter] % 16;
if (i > 9)
tempstr += ((char)(i - 10 + 0x41)).ToString();
else
tempstr += ((char)(i + 0x30)).ToString();
hashstr += tempstr;
}
return hashstr;
}
/// <summary>
/// SHA-384
/// </summary>
/// <param name="str"></param>
public static string SHA_384(string str)
{
System.Security.Cryptography.SHA384CryptoServiceProvider SHA384CSP =
new System.Security.Cryptography.SHA384CryptoServiceProvider();
byte[] bytValue = System.Text.Encoding.UTF8.GetBytes(str);
byte[] bytHash = SHA384CSP.ComputeHash(bytValue);
SHA384CSP.Clear();
string hashstr = "", tempstr = "";
for (int counter = 0; counter < bytHash.Length; counter++)
{
long i = bytHash[counter] / 16;
if (i > 9)
tempstr = ((char)(i - 10 + 0x41)).ToString();
else
tempstr = ((char)(i + 0x30)).ToString();
i = bytHash[counter] % 16;
if (i > 9)
tempstr += ((char)(i - 10 + 0x41)).ToString();
else
tempstr += ((char)(i + 0x30)).ToString();
hashstr += tempstr;
}
return hashstr;
}
/// <summary>
/// SHA-512
/// </summary>
/// <param name="str"></param>
public static string SHA_512(string str)
{
System.Security.Cryptography.SHA512CryptoServiceProvider SHA512CSP =
new System.Security.Cryptography.SHA512CryptoServiceProvider();
byte[] bytValue = System.Text.Encoding.UTF8.GetBytes(str);
byte[] bytHash = SHA512CSP.ComputeHash(bytValue);
SHA512CSP.Clear();
string hashstr = "", tempstr = "";
for (int counter = 0; counter < bytHash.Length; counter++)
{
long i = bytHash[counter] / 16;
if (i > 9)
tempstr = ((char)(i - 10 + 0x41)).ToString();
else
tempstr = ((char)(i + 0x30)).ToString();
i = bytHash[counter] % 16;
if (i > 9)
tempstr += ((char)(i - 10 + 0x41)).ToString();
else
tempstr += ((char)(i + 0x30)).ToString();
hashstr += tempstr;
}
return hashstr;
}
#endregion
}
3.调用代码:
class Program
{
static void Main(string[] args)
{
var context = "123456789";
var aa=DBB.Authorize.New.Common.SecurityHelper.MD5Encrypt32Bit(context);
Console.WriteLine(aa);
aa =DBB.Authorize.New.Common.SecurityHelper.MD5Encrypt64Bit(context);
Console.WriteLine(aa);
aa = DBB.Authorize.New.Common.SecurityHelper.SHA_1(context);
Console.WriteLine(aa);
Console.ReadLine();
}
}
4.输出日志:
大家好,我是MiniFat,感谢各位小伙伴点赞、收藏和评论,文章持续更新,我们下期再见!文章来源:https://www.toymoban.com/news/detail-443368.html
参考链接:
.net中C#命名空间System.Security.Cryptography简记_天富儿的博客-CSDN博客_system.security.cryptography
官方介绍链接
System.Security.Cryptography 命名空间 | Microsoft Docs文章来源地址https://www.toymoban.com/news/detail-443368.html
到了这里,关于.Net 加密解密组件工具类 System.Security.Cryptography.Algorith的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!