zoukankan      html  css  js  c++  java
  • 加密(转摘)

     

      加密

    1、概述

    当在不安全信道上传递一些敏感数据时,要对这些数据采取保护措施,即便是被人截获也难以从中得到所携带的信息,当我们保存一些敏感数据到物理设备时。也需要先将这些数据加密。

    在对数据加密时,对于不同的场景采用的加密方式是不同的,一般来说常用的数据加密方式有三种。

    ²        私钥加密:私钥加密算法使用单个私钥来加密和解密数据。由于具有密钥的任意一方都可以使用该密钥解密数据,因此必须保护密钥不被未经授权的代理得到。私钥加密又称为对称加密或单钥加密,因为同一密钥既用于加密又用于解密。私钥加密算法非常快(与公钥算法相比),特别适用于对较大的数据流执行加密转换。一般情况下,对正式数据的传送中,一般先用公钥传送对称密钥,再用这个对称密钥加密要传送的数据。私钥加密的关键是如何保护对称密钥

    ²        公钥加密:公钥加密使用一个必须对未经授权的用户保密的私钥和一个可以对任何人公开的公钥。公钥和私钥都在数学上相关联;用公钥加密的数据只能用私钥解密,而用私钥签名的数据只能用公钥验证。公钥可以提供给任何人;公钥用于对要发送到私钥持有者的数据进行加密。两个密钥对于通信会话都是唯一的。公钥加密算法也称为不对称算法,原因是需要用一个密钥加密数据而需要用另一个密钥来解密数据。它只可以加密少量数据。公钥加密一般用于交换私钥加密的私钥、对摘要进行签名等。

    单向哈希加密:哈希算法将任意长度的二进制值映射为固定长度的较小二进制值,这个小的二进制值称为哈希值。哈希值是一段数据唯一且极其紧凑的数值表示形式。如果散列一段明文而且哪怕只更改该段落的一个字母,随后的哈希计算都将产生不同的值。要找到散列为同一个值的两个不同的输入,在计算上是不可能的。注意当用哈希算法对消息进行散列后是不能解密的,只能对同样的消息用同样的哈希算法加密,对照加密后的值是否一致,从而判断消息是否被篡改。哈希加密主要用于密码验证、身份验证、数据完整性等方面。比如数字签名的基本原理如下:

     

    可以看出,数字签名不是一种具体的技术实现,它是基于以上各种加密技术组合的一种数据验证解决方案。

    我们在配置应用程序块中已说明如何将配置数据加密,其他应用程序块的加密方式也相同,一般数据和配置应用程序块的配置数据我们会加密。比较理想的做法是用配置控制台将配置文件加密时,用DPAPI Provider ,这样我们就不用保存对称密钥了,系统会自动管理,这样数据加密就完全透明了,无需我们任何干预。

    2、使用步骤

    ⑴用配置控制台添加加密应用程序块

    跟前面的配置方法一致,添加加密应用程序块后,会有两个节点Hash ProviderSymmetric Provider,没有提供Asymmetric Provider,分别提供哈希加密和对称加密的功能。这里已对称加密的设置为例来说明,在Symmetric Provider节点上点右键,New->Symmetric Algorithm Provider,选RijndaelManagedRijndael是美国AES选定的加密标准,DES(原来的加密标准)会逐渐被放弃,.Net Framework中内置的Rijndael算法的secure key32byteIV16byte,比其他算法强度都高,而且非常高效,是首先得对称加密算法。选定RijndaelManaged后,我们再选Generate创建一个对称密钥,然后确认就可以了。

    ⑵写代码

    我们一般用其FaçadeCryptographer来写代码,

    // 哈希算法的四个方法原型如下:

    public static byte[] CreateHash(string hashInstance, byte[] plaintext);
    public static string CreateHash(string hashInstance, string plaintext);
     public static bool CompareHash(string hashInstance, byte[] plaintext, byte[] hashedText);
    public static bool CompareHash(string hashInstance, string plaintext, string hashedText);
    // 对称加解密的四个方法原型如下:public static string EncryptSymmetric(string symmetricInstance, string plaintext);
    public static byte[] EncryptSymmetric(string symmetricInstance, byte[] plaintext);
     public static string DecryptSymmetric(string symmetricInstance, string ciphertextBase64);
    public static byte[] DecryptSymmetric(string symmetricInstance, byte[] ciphertext);
     

    ①对称加密代码
    //加密
    private const string symmProvider = "SymmProvider";
    string cipherText = Cryptographer.EncryptSymmetric(symmProvider, 要加密的文本);
    //解密
    string plainText = Cryptographer.DecryptSymmetric(symmProvider, 密码文本);
    // 或者用下面的代码

    //加密
    String[] cipherText = Cryptographer.EncryptSymmetric(symmProvider, Encoding.Unicode.GetBytes(password));
    //解密
    string[] plainText = Cryptographer.DecryptSymmetric(symmProvider, Encoding.Unicode.GetBytes(password));

    注意这里的symmProvider 是指标示具体的加密算法节点名称,如RijndaelManaged,而不是节点“Symmetric Providers”的名称。上面两种加解密代码,到底用那种要看你具体应用情况。

    ②哈希算法代码
    private const string hashProvider = "PasswordHasher";
    string hashPassword = Cryptographer.CreateHash(hashProvider, originalPassword);//生成摘要
    bool isPass = Cryptographer.CompareHash(hashProvider, originalPassword, hashPassword);//比较是否与原来的相同
    // 或者
    String[] hashPassword = Cryptographer.CreateHash(hashProvider, Encoding.Unicode.GetBytes(password));//生成摘要
    bool isPass = Cryptographer.CompareHash(hashProvider, Encoding.Unicode.GetBytes(password), hashPassword);//比较是否与原来的相同

    还有就是用哈希加密时一定要用Salted hash,这样强度更高。

  • 相关阅读:
    Python读写Excel文件和正则表达式
    R Language Learn Notes
    Electron小记
    Unity商店下载的文件保存路径?
    Unity LineRenderer制作画版
    unity图形圆形展开
    [转]资深CTO:关于技术团队打造与管理的10问10答
    unity游戏在ios11上不显示泰语解决办法
    jQuery火箭图标返回顶部代码
    jQuery火箭图标返回顶部代码
  • 原文地址:https://www.cnblogs.com/ltjabc/p/208270.html
Copyright © 2011-2022 走看看