2. 密码加密

182 阅读2分钟

常见的增删改查代码就不CV到这来了,都能看懂

加密算法

把密码明文放在数据库里面是一件很蠢的事情,因为这样开发者能轻而易举看到每一个用户的账户信息

呃呃,看不看到对现在的环境有啥影响吗

不过我有老一辈电竞人的骄傲,这点职业操守还是要有的

常见的密码加密方式有:

  1. 单向哈希加密:MD5 SHA1等;这种单向加密已经做到能让正常人看不懂密码了,不过固定字符串只能生成唯一对应的哈希字符串,比如123456的md5永远都是e10adc3949ba59abbe56e057f20f883e,有经验的老东西看到e10adc就可以猜猜是不是123456作为密码了
  2. 加盐:在后端单向哈希过程中添加salt。比如123456在后端处理中随便加上crisptomato之类不知所谓的单词,又或者随机生成一段字符串添加进去再进行MD5加密,还能再加一个单词二次加盐,还能三次四次……反正就是后端自己加密加到最后
  3. bcrypt:参考这篇论文A Future-Adaptable Password Scheme,反正看不懂,能用这玩意就行。
  4. scrypt:反正看不懂论文,能用就行

写个test

// ScryptPwd
// 将密码使用scrypt加密
func ScryptPwd(password string) string {
   const KeyLen = 10
   salt := make([]byte, 8)
   salt = []byte{12, 32, 4, 6, 66, 22, 222, 11}

   HashPwd, err := scrypt.Key([]byte(password), salt, 16384, 9, 1, KeyLen)
   if err != nil {
      log.Fatal(err)
   }

   FinalPwd := base64.StdEncoding.EncodeToString(HashPwd)
   return FinalPwd
}

写好之后可以使用gorm的hook来在创建之前调用

func (u *User) BeforeCreate(tx *gorm.DB) (err error) {

   u.Password = ScryptPwd(u.Password)

   return nil
}