`
923723914
  • 浏览: 635827 次
文章分类
社区版块
存档分类
最新评论

加密算法中的加盐值

 
阅读更多

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

    /**
     * 获取当前用户盐
     *
     * @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造盐,这样,不同的玩家看到的加密后的字符串也不一样。

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



分享到:
评论

相关推荐

    jqueryMD5加密

    用于js加密,web页面值加密,是一种不可逆的加密算法

    关于python中密码加盐的学习体会小结

    在常用的hashlib模块里还有sha1()等方法,它的本质和md5是...而md5是最常见的加密算法,生成速度很快,生成结果是固定的128 bit字节,通常用一个32位的16进制字符串表示。 给密码加盐是什么:见上面提到的,下面内

    Flask框架中密码的加盐哈希加密和验证功能的用法详解

    明文存储:肉眼就可以识别,没有任何安全性。... 加盐哈希加密:加密时混入一段“随机”字符串(盐值)再进行哈希加密。即使密码相同,如果盐值不同,那么哈希值也是不一样的。现在网站开发中主要是运用这种加密方法。

    登陆加密MD5+Salt+SHA1附代码

    1是一种数据加密算法,该算法的思想是接收一段明文,然后以一种不可逆的方式将它转换成一段(通常更小)密文,也可以简单的理解为取一串输入码(称为预映射或信息),并把它们转化为长度较短、位数固定的输出序列即...

    C#使用 Salt + Hash 来为密码加密

    本文主要介绍了几种常见的破解密码的方法,为密码加盐(Salt)以及在.NET中的实现等。具有一定的参考价值,下面跟着小编一起来看下吧

    arsenic:C ++ Qt5应用程序,用于使用Strongs算法加密文件并计算哈希值。 将Botan和Argon2用于基本体

    使用强大算法对文件和文本进行加密的简单工具。 已在Windows 10和所有主要Linux发行版上进行测试。 Arsenic是在Archlinux上开发的。 本自述文件和中的更多屏幕截图。 简单说明: Arsenic旨在作为一种轻巧的便携式...

    Base64, SHA-256等加密算法

    所需的工具:Spring开发工具或者其他java开发... Spring Security 就是使用了 SHA-256 + 盐(随机值)  MD5,SHA-1, SHA-256 消息摘要,单向,不可逆  算法确定,结果长度确定  SHA 不是傻,是security-Hash 函数

    简洁大方干净!完整的php+mysql实现的登录和用户注册源码(含加密安全,解压即用)

    3、使用了php内置的字段加密函数password_hash(),单向哈希算法。且自动随机加盐(random salting),允许不同的用户注册时使用相同的密码。登录时使用password_verify()函数验证密码以及密码的哈希值。 4、用于创建...

    AES:Python中的高级加密标准(AES)实现

    高级加密标准(AES) 这是Python中的AES实现。 分组密码操作模式为CTR。 该实现支持AES-128,AES-192和AES-256(默认)。 AES密钥和HMAC密钥是使用hashlib的scrypt和一个随机的16字节盐从用户密码生成的(密钥的...

    shiro安全管理框架之Cryptography.docx

    一般进行散列时最好提供一个salt(盐),比如加密密码“admin”,产生的散列值是“21232f297a57a5a743894a0e4a801fc3”,可以到一些md5解密网站很容易的通过散列值得到密码“admin”,即如果直接对密码进行散列相对...

    新版前后端接口安全技术JWT+RSA加密

    - 常见的非对称加密算法和非对称的加密方式? ? ? ? ? ? ?- 老版本只使用jwt进行加密的弊端? ? ? ? ? ? ?- 授权中心的授权流程? ? ? ? ? ? ?- 如何整合网关组件实现jwt安全验证? ? ? ? ? ? ?- 理解什么是公钥什么是...

    phc-bcrypt:Unified易于使用的Unified API用于bcrypt密码哈希算法

    密码加密 :locked: 遵循PHC字符串格式的Node.JS bcrypt密码哈希算法。 编码为 :red_heart: 作者( 。 PHC字符串格式 PHC字符串格式是一种尝试,它指定一种... 一系列位,称为B64中编码的加密盐。 string 通过B64

    Keystore文件如何生成的?

    ... ... 利用你的密码生成一个密钥,上图用的是scrypt算法,...利用第一步生成的密钥对你生成账户时产生的私钥和参数进行对称加密,注意,使用对称加密算法说明这个密钥既能加密也能解密,上图用的对称加密算法时aes-128-

    argon2id:Go的Argon2id密码哈希和验证

    它强制使用Argon2id算法变体和加密安全的随机盐。用法package mainimport ("log""github.com/alexedwards/argon2id")func main () {// CreateHash returns a Argon2id hash of a plain-text password using the// ...

    upash:for用于密码哈希算法的统一API

    确实,以上示例兼作“如何不进行密码存储”的清单:简单的散列,未加盐的值,滥用加密以及密码迁移失败。 (有关这些错误的原因的更多信息,请参阅我们的) 这里有两种可能的解释:第一,公司没有足够的资源来保护...

    nve:一个可以轻松存储和检索名称的实用程序

    数据将保存在 3 个表中:一个Name查找表,一个存储每个 Name:Value 对的唯一加密密钥的 1/2(又名“盐”)的表,最后一个存储加密的Value数据的表. 检索数据也很容易,以下面的代码为例:简单解密函数调用 set ...

    Linux 中安全哈希密码技术 (CSHPT) 的密码分析-研究论文

    像 MD5、SHA-216 等加密散列函数可以很容易地被黑客利用强大的硬件破解。 此外,这些不是慢速函数,需要实现慢速散列函数并添加盐或胡椒粉,以承受攻击者使用的不断增长的技术。 通常,这些函数在 Linux/Unix 密码...

    Skeleton Key-crx插件

    语言:English 一个安全的密码生成器,它使用您的主...使用超安全的PBKDF2算法对这三部分数据进行重复加密加密。 v3中的更改:-修复了具有站点密钥建议的错误。 v2中的更改:-使用当前选项卡的URL作为站点密钥的建议。

    europython:密码学实例

    纯文本可以是任何数据:图片,电子表格,甚至整个硬盘^密文:加密形式的信息^密码:将纯文本转换为密文,反之亦然的算法^ Salt –随机化密钥的哈希值; 防止彩虹表攻击钥匙^ IV(初始化向量)–将加密的消息随机化...

    sinatra-password-security-online-web-sp-000

    目标 了解有关bcrypt的知识,它是一种用于加密密码的宝石。...盐只是添加到哈希中的随机字符串。这样,如果我们的两个用户使用密码“ fido”,则他们在我们的数据库中将以不同的哈希值结束。 我们将使用开源gem

Global site tag (gtag.js) - Google Analytics