软件外包服务岗前技能训练(一)

目录

一、前言

二、帮助类

MD5加密

MD5加密的好处

哈希算法:

总结

一、前言

该技能,是本人对自己一段时间学习的一个小小的总结。

二、帮助类

MD5加密

MD5(Message-Digest Algorithm 5)是一种常用的哈希函数,可用于加密存储在数据库中的密码或任何敏感信息。MD5算法将任意长度的消息作为输入,并输出128位的哈希值。它是一种单向加密算法,意味着无法通过哈希值逆向推导出原始消息内容。大多数编程语言中,MD5加密可以通过调用相应的库或函数来实现。例如,Python中的 hashlib 模块、PHP中的 md5() 函数、Java中的 MessageDigest 类等,都可以用于对字符串进行MD5加密处理。使用MD5加密通常可以提供一定程度的安全保障,但需要注意的是,由于MD5算法的漏洞已经被发现,它已经不再被认为是安全加密算法。因此,在现代的安全领域中,建议使用更加安全的加密算法,如SHA-256等。

MD5加密的一些代码帮助类

namespace Common
{
    public class MD5Helper
    {
        /// <summary>
        /// 64位MD5加密,无法解密
        /// </summary>
        /// <param name="password">密码</param>
        /// <returns>加密后的密码</returns>
        public static string MD5Encrypt64(string password)
        {
            string cl = password;
            MD5 md5 = MD5.Create(); //实例化一个md5对像
            // 加密后是一个字节类型的数组,这里要注意编码UTF8/Unicode等的选择 
            byte[] s = md5.ComputeHash(Encoding.UTF8.GetBytes(cl));
            return Convert.ToBase64String(s);
        }
    }
}

这个是对MD5进行的一个加密代码。一般像我们的登录的密码或者一些比较重要的数据要保存到数据库的时候,我们就可以使用这个MD5对数据进行一个加密,保证我们的数据。

MD5加密的好处

  1. 密码存储:MD5加密可用于存储密码,而不是存储明文密码。这样即使数据库泄露,攻击者也无法直接获取用户的密码。

  2. 数字签名:MD5加密可用于生成文件的数字签名,以验证文件的完整性和真实性。

  3. 安全传输:可以通过MD5对消息进行加密,以确保数据在传输过程中不被篡改。

  4. 数据一致性检查:MD5可用于对文件或数据进行一致性检查,以确保其在传输或存储过程中未被篡改。

尽管MD5在过去被广泛使用,但由于其已被证明存在严重安全漏洞,因此在现代安全环境中,MD5加密已不再被推荐作为安全的加密算法。相比之下,更强大的哈希算法如SHA-256 或 SHA-3 更适合用于密码存储和数据加密。

哈希算法:

简单的说一下哈希算法:

哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。

借鉴网上前辈的代码:

// 这个算法在开源的SDBM中使用,似乎对很多不同类型的数据都能得到不错的分布。
unsigned int SDBMHash(const char  *str)
{
    unsigned int hash =  0 ;
    while  (*str)
    {
        // equivalent to: hash = 65599*hash + (*str++);
        hash = (*str++) + (hash << 6 ) + (hash <<  16 ) - hash;
    }

    return  (hash &  0x7FFFFFFF );
}

// 从Robert Sedgwicks的 Algorithms in C一书中得到。
// 已经添加了一些简单的优化的算法,以加快其散列过程。
unsigned int  RSHash(const char  *str)
{
    unsigned int  b =  378551 ;
    unsigned int  a =  63689 ;
    unsigned int  hash =  0 ;

    while  (*str)
    {
        hash = hash * a + (*str++);
        a *= b;
    }
    return  (hash &  0x7FFFFFFF );
}

// Justin Sobel写的一个位操作的哈希函数。
unsigned int  JSHash(const char  *str)
{
    unsigned int  hash =  1315423911 ;

    while  (*str)
    {
        hash ^= ((hash << 5 ) + (*str++) + (hash >>  2 ));
    }

    return  (hash &  0x7FFFFFFF );
}

// 该散列算法是基于贝尔实验室的彼得J温伯格的的研究。
// 在Compilers一书中(原则,技术和工具),建议采用这个算法的散列函数的哈希方法。
unsigned int  PJWHash(const char  *str)
{
    unsigned int  BitsInUnignedInt = (unsigned  int )(sizeof(unsigned  int ) *  8 );
    unsigned int  ThreeQuarters  = (unsigned  int )((BitsInUnignedInt  *  3 ) /  4 );
    unsigned int  OneEighth = (unsigned  int )(BitsInUnignedInt /  8 );
    unsigned int  HighBits = (unsigned  int )( 0xFFFFFFFF ) << (BitsInUnignedInt

                                               - OneEighth);
    unsigned int  hash   =  0 ;
    unsigned int  test   =  0 ;

    while  (*str)
    {
        hash = (hash << OneEighth) + (*str++);
        if  ((test = hash & HighBits) !=  0 )
        {
            hash = ((hash ^ (test >> ThreeQuarters)) & (~HighBits));
        }
    }

    return  (hash &  0x7FFFFFFF );
}

// 和PJW很相似,在Unix系统中使用的较多。
unsigned int  ELFHash(const char  *str)
{
    unsigned int  hash =  0 ;
    unsigned int  x  =  0 ;
    while  (*str)
    {
        hash = (hash << 4 ) + (*str++);
        if  ((x = hash & 0xF0000000L) !=  0 )
        {
            hash ^= (x >> 24 );
            hash &= ~x;
        }
    }
    return  (hash &  0x7FFFFFFF );
}

// 这个算法来自Brian Kernighan 和 Dennis Ritchie的 The C Programming Language。
// 这是一个很简单的哈希算法,使用了一系列奇怪的数字,形式如31,3131,31...31,看上去和DJB算法很相似。
unsigned int  BKDRHash(const char  *str)
{
    unsigned int  seed =  131 ;  // 31 131 1313 13131 131313 etc..
    unsigned int  hash =  0 ;
    while  (*str)
    {
        hash = hash * seed + (*str++);
    }
    return  (hash &  0x7FFFFFFF );
}

// 这个算法是Daniel J.Bernstein 教授发明的,是目前公布的最有效的哈希函数。
unsigned int  DJBHash(const char  *str)
{
    unsigned int  hash =  5381 ;

    while  (*str)
    {
        hash += (hash << 5 ) + (*str++);
    }
    return  (hash &  0x7FFFFFFF );
}

// 这是本文作者Arash Partow贡献的一个哈希函数,继承了上面以旋转以为和加操作。
unsigned int  APHash(const char  *str)
{
    unsigned int  hash =  0 ;
    int  i;

    for  (i= 0 ; *str; i++)
    {
        if  ((i &  1 ) ==  0 )
        {
            hash ^= ((hash << 7 ) ^ (*str++) ^ (hash >>  3 ));
        }
        else
        {
            hash ^= (~((hash << 11 ) ^ (*str++) ^ (hash >>  5 )));
        }
    }

    return  (hash &  0x7FFFFFFF );
}

// 由伟大的Knuth在《编程的艺术 第三卷》的第六章排序和搜索中给出。
unsigned int DEKHash(const char *str)
{
      int len=strlen(str);
      unsigned int hash = len;
      for(int i = 0; i < len; i++)
      {
         hash = ((hash << 5) ^ (hash >> 27)) ^ str[i];
      }
      return hash;
}

总结

MD5帮助类能够为开发人员提供便捷的方式来实现数据加密和摘要处理,从而提高数据安全性和完整性。然而,需要注意的是,由于MD5算法存在安全性漏洞,因此在实际应用中,建议使用更安全的哈希算法来代替MD5。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值