什么是盐加密 为什么使用盐加密密码

加盐加密是一种对系统登录口令的加密方式,它实现的方式是将每一个口令同一个叫做”盐“(salt)的n位随机数相关联。无论何时只要口令改变,随机数就改变。随机数以未加密的方式存放在口令文件中,这样每个人都可以读。不再只保存加密过的口令,而是先将口令和随机数连接起来然后一同加密,加密后的结果放在口令文件中。


在应用中,出于到安全的考虑和数据的保密,需要使用到加密算法,有时候为了让加密的的结果更加扑朔迷离神鬼莫测一些,常常会给被加密的数据加点“盐”。说白了,盐就是一串数字,完全是自己定义的,不多说,上实例。

/**
     * 获取当前用户盐
     *
     * @param string $extraKey 额外密钥
     * @return string
     */
    public function getSalt($extraKey = null)
    {
        // 今天凌晨5点以后~第二天凌晨5点前
        if (date('G') >= 5) {
            $dateString = date('md');
        }
        // 今天凌晨5点前
        // 日期标示符仍用昨天的
        else {
            $dateString = date('md', strtotime('-1 day'));
        }

        return md5('VoyageMobile:' . $dateString . ':' . $this->_uid . ':' . $extraKey);
    }

这就是我们程序中,使用的一个生成盐值的函数,这函数的返回值就是所谓的盐值,请注意这个函数的命名,哈哈。 函数的使用如下:
/**
     * 加密
     *
     * @param string $content 待加密内容
     * @param string $extraKey 额外密钥
     * @return string
     */
    public function encrypt($content, $extraKey = null)
    {
        return Helper_Cryption_Rijndael::encrypt($content, $this->getSalt($extraKey));
    }

为什么我们要使用盐值。 在回答这个问题之前,我们讨论一下加密算法,常用的加密算法大致分为两种:可逆和不可逆,如MD5()不可逆 。RijnDael可逆。

在不可逆的加密算法中,加盐值通常是“锦上添花”,因为类似于Md5()这样的算法已经够用了,如果还担心的会被暴力破解的话,可加点盐。 如:

md5('VoyageMobile:' . $this->getSalt($extraKey));
重点是在可逆的算法中使用加盐值。

在我们的游戏中,我们需要对用户ID即UID使用可逆算法加密,为什么呢,如果不加密会很危险,例如,其它玩家获取到你的UID可以重复攻击你,或者改一下UID就可以攻击其他玩家,在造船厂,改一下船的ID,如果后台不验证,就可以随意造船了,这就是串号攻击。还有一个特殊的情况,如果我知道了一个装备的ID, 如果这个装备恰好是赠品,不能在商店出售, 我可以伪造一个URL请求购买,这个时候,后台判断这个商品确实存在(因为它是赠品),所以可能购买成功。

这个时候就要对ID加密了,而且还是可逆的,因为我需要知道你将要攻击谁,购买什么装备,对吧。这个时候或许加盐的必要性还是没有体现出来,因为我对ID加密就比较安全了,这样就可以 防止串号 了,何必还有一个加盐值。

请注意,会有这样的情况,在活动模块中,我得到一个装备,我虽然不知道itemId,当是我知道了这个装备ID加密后的一串数字。然后我就去拿这个数字去商店里面购买这个装备,而这个装备又是不能购买的。在数据库中,我们把不能购买的装备的价格设置为0,并且和能购买的装备放在一个表中。 注意,这样的设计导致我能够购买到这个装备,而且一毛钱不花!

怎样解决这个问题,我们就需要加盐了。思路就是,在活动模块中,给所有的装备加密使用盐值,在商店模块中,也给所有的装备加盐,使用不同的盐值。这样的结果就是同一个装备,在不同的模块itemId也是不同的。

在后台也需要加一个判断,这个装备是否能购买!

这就是加盐的一个好处。

需要注意点:

保证盐值的唯一行,在我们游戏中,通常会使用到玩家UID造盐,这样,不同的玩家看到的加密后的字符串也不一样。

保证盐值的时效性,这也是出于安全的考虑,经常换盐值,这样加密后的字符串也是变动的,不容易找到规律。


  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值