数据加密的基本过程是对原来为明文的文件或数据按某种算法进行处理,使其不可读,通常称为“密文”,使其只有在输入相应的密钥之后才能显示本来内容,通过这样的途径达到保护数据不被非法人窃取、阅读的目的。该过程的逆过程为解密,即将该编码信息转化为其原来的数据。
用哈希函数进行加密的算法就称为散列算法。哈希函数将任意长度的二进制字符串映射为固定长度的小型二进制字符串。加密哈希函数具有这样的属性:两个不同的输入不可能具有相同的散列值;也就是说,两组数据的散列值仅在对应的数据也匹配时才会匹配。数据的少量更改会在哈希值中产生不可预知的大量更改,所以很难从加密后的文字中找到蛛丝马迹。
常用的散列算法有MD5和SHA1,下面分别进行介绍:
MD5的全称是信息-摘要算法(Message-Digest Algorithm 5)在20世纪90年代初由MIT Laboratory for Computer Science和Rsa Data Security Inc的Ronald l. Rivest开发,经MD2、MD3和MD4发展而来。它的作用是让大容量信息在用数字签名软件签署私人密匙前被“压缩”成一种保密的格式(把一个任意长度的字节串变换成一定长的大整数)。不管是MD2、MD4还是MD5,都需要获得一个随机长度的信息并产生一个128位的信息摘要。
SHA1的全称是安全哈希算法(Secure Hash Algorithm,SHA),MD5算法的哈希值大小为128位,而SHA1算法的哈希值大小为160位。两种算法都是不可逆的。
下面通过几个实例讲解MD5和SHA1算法是如何通过代码实现加解密的:
(1)MD5算法的安全命名空间代码如下:
加密方法有2种:
①使用new运算符创建安全对象,并通过加密方法Get_MD5_Method1返回加密后的字符串。方法直接使用字节数组bytResult提供加密类使用,并携带数据返回。代码如下:
②为适应不同编码方式的加密,通过调用特定加密算法抽象类上的Create方法创建特定加密算法。在加密前需要指定编码类型,常用的包括UTF8,UTF7,Unicode等。具体实现代码如下:
③为了给指定密码和哈希算法生成一个适合于存储在配置文件中的哈希密码,可以直接使用HashPasswordForStoringInConfigFile创建一个哈希密码值,在窗体身份验证凭据存储到应用程序的配置文件时使用,实例代码如下:
(2)安全哈希算法主要适用于数字签名标准(Digital Signature Standard,DSS)里面定义的数字签名算法(Digital Signature Algorithm,DSA)。对于长度在2~64位之间的消息,SHA1会产生一个160位的消息摘要。当接收到消息的时候,用这个消息摘要来验证数据的完整性。传输的过程中数据很可能会发生变化,那么就会产生不同的消息摘要。
该例子是以SHA1为例,读者需要熟记以下安全命名空间:
它通过使用new运算符创建安全对象,并通过加密方法Get_SHA1_Method1返回加密后的字符串。方法直接使用字节数组bytResult提供加密类使用,并携带数据返回。
SHA1安全加解密代码如下:
需要特别注意密码和用户名的哈希处理和存储。下面的实例将从安全的角度介绍如何将用户输入的用户名称和密码数据保存到自定义的配置文件中。
实例允许用户选择加密的类型是MD5或者SHA1,并且在对密码进行加密时调用方法HashPasswordForStoringInConfigFile,最终显示配置中包含用户定义和哈希密码的credentials节。
配置节信息加密实例代码如下: