Golang常用加密算法

        当我们希望数据不要直接呈现出其结果时我们会选择做加密处理,比如:用户账号的密码、手机号、身份证号等敏感信息通常都是经过加密处理后再写入数据库进行存储的,否则这些信息可能会被拦截而导致信息泄露,因此这就涉及到一个加密的问题。
        在讲加密之前,我们要提一下“加盐”的问题。这里的“盐”指的是混淆串,比如:需要加密的数据是“abc123”,我给它拼接上其他的字符串,让它变成“2006-01-02 15:04:05abc1232006-01-02 15:04:05”,可以看出在原串的开头和结尾我都加了其他字符串进去,这些字符串就是混淆串,也就是所谓的“盐”。那么为什么要“加盐”呢?很简单的一个道理,万一我们的加密数据被破解了,我们的数据在没有“加盐”的情况下不就直接暴露其原值了吗?这个数据就这样直接泄露出去了。但如果我们做了“加盐”处理,即使数据被成功解密出来了,要得到真正的结果还得废很大的功夫,拿上面的例子,“2006-01-02 15:04:05abc1232006-01-02 15:04:05”,假设这个串是被破解出来后的结果,距离要得到“abc123”还差得远,考虑到效率的问题,也就不会有人花那么多精力在破解这个数据上。上面这个例子其实还是很有规律可言的,当然实际开发中我们“加盐”肯定不会这么有规律,我们可以在开头、串中间、结尾插入任意长度的任意字符串构成混淆,就目前技术而言要从这个加了盐的混淆串中提取出真实有效的数据基本就不可能了。
        在密码学中常用的加密算法有3种Hash算法(消息摘要Message Digest)编码解码算法加密解密算法
        Hash算法无需秘钥,并且过程是不可逆的。也就是说一旦经过Hash之后再也没办法转回Hash前的串,因此比较适合对那么只用来验证的数据做加密,例如:密码。

//常见的Hash算法:md4(128位)、md5(128位)、sha1(160位)、sha256(256位)、sha512(512位)
/**
	md5、sha1、sha256、sha512加密算法
	@param src [string] 原始待加密数据
	@param CryptTool [string] 加密类型
	@param isHex [bool] 数据是否为16进制串,true表示16进制串,需要进行解析,false表示非16进制串
	@param isDoubleCrypt [bool] 判断是否做二次加密
	@return [string] Hash加密后的串
 */
func Hash(src,CryptTool string,isHex bool,isDoubleCrypt bool)string{
   
	var hash hash.Hash

	switch CryptTool {
   
	case "md5":
		hash = md5.New()
	case "sha1":
		hash = sha1.New()
	case "sha256":
		hash = sha256.New()
	case "sha512":
		hash = sha512.New()
	}

	if isHex {
   
		//如果加密串本身是16进制串需要做解析
		csrc,_ := hex.DecodeString(src)
		hash.Write(csrc)
	}else {
   
		hash.Write([]byte(src))
	}

	//一次加密后的结果
	cryptStr := fmt.Sprintf("%x",hash.Sum(nil))

	if isDoubleCrypt {
   
		//做二次加密
		hash.Reset()
		hash.Write([]byte(cryptStr))
		cryptStr = fmt.Sprintf("%x",hash.Sum(nil))
	}

	return cryptStr
}

        编码解码严格来说不能算加密,只是对数据做16进制的编码而已,编码解码无需秘钥,并且其过程是可逆的,可以将原串进行编码,同样可以以相反的过程进行解码

//常见编码解码算法:base64、base58
/**
	base64加密算法
	@param src [string] 原始待编码数据
	@param isEncode [bool] 判读是否进行编码,true表示编码,false表示解码
	@return [string] 编码或解码后的串
*/
func EnDecode(src string,isEncode bool)string{
   

	var cryptStr string

	if isEncode {
   
		//编码
		cryptStr = base64.StdEncoding.EncodeToString([]byte(src))
	}else {
   
		//解码
		tmp,err := base64.StdEncoding.DecodeString(src)

		CheckError(err,BASE64_DECODE_ERROR,"Base64解码失败---来自CryptTool.go的EnDecode函数")

		cryptStr = string(tmp)
	}

	return cryptStr
}

        加密解密算法需要秘钥,并且过程是可逆的(这里解释一下秘钥的概念:秘钥就是秘密的钥匙,在这里可以认为是对数据做加密和解密的钥匙,下面提到的公钥和私钥都统称为秘钥)。加密解密这里只讨论两种:对称加密非对称加密。对称加密使用的是对称秘钥(即私钥),在加密和解密过程中使用的是相同的秘钥。非对称加密使用的是非对称秘钥(即公钥),用公钥加密,用私钥解密。
        加密解密算法的加解密模式有很多种,这里只讨论使用最多的CBC(密码分组链接)模式
        对称加密的典型算法有很多,比较常见的有DES3DESAES

/**
	des加密算法,秘钥长度为8B,故秘钥字符串长度为8
	@param src [string] 原始待加密数据
	@return [string] DES加密后的串
*/
func DESEncrypter(src,key string)string{
   
	
	if len(key) != 8 {
   
		//des算法秘钥长度必须是长度为8的串,因为构建分组块的时候每个分组块的长度必须等于秘钥长度
		panic("秘钥长度不是8---来自CryptTool.go的DESCrypter函数")
	}
	
	//秘钥(此处为私钥)
	//分组块
	block,err := des.NewCipher([]byte(key))

	CheckError(err,BLOCK_GENERATE_ERROR,"分组块构建失败---来自CryptTool.go的DESCrypter函数")
	//块长度(即秘钥长度)
	blockSize := block.BlockSize
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值