SHA-256算法改进策略

    在我之前的文章中理了一下SHA-256算法的实现过程:https://blog.csdn.net/kcstrong/article/details/80853243

    为什么要对其改进呢?

    先来看一下如何加密防刷:使用SHA-256可以针对源文件生成加密key,为一个256位二进制格式,表述为64位16进制的字符串格式,可以用于对网络链接中的核心参数进行加密处理,做法是:选用几个核心参数,连成一个源字符串,然后使用SHA-256生成一个加密串,放入url中,在服务端使用相同法则生成加密串,如果一样,则可以确认该链接为有效链接。

    上面的这个加密方式有一个简单的破解方式:当伪装者猜到或者是试出加密key生成算法是使用SHA-256,且猜出所使用的生成源字符串的话,即可自己使用SHA-256生成相应的串,因为SHA-256为标准算法,随处可以获得,自己写也并不费力,上面的加密防刷机制即会失效,因此我们需要将SHA-256做个改进,使伪装者即使知道规则,也难以通过规则及算法(得不到)生成出相应的key。

    说一下具体的实现方式

    从SHA-256的算法实现来看,如果要改其中的策略,是非常困难的,需要严谨的数学理论支撑,而且该算法目前已经经过了多方考证其正确性,改掉其中的策略后的正确也无法验证,因而,决定从外围入手。

    第一个思路:https://blog.csdn.net/kcstrong/article/details/80853243 这个是我之前文章整理的SHA-256实现步骤,在第四步中:

    有一个补位的串,第一位为1,然后有k个0,该策略可以做为改进点,一个思路是:第一位补0,然后k个1,对原算法的补位串作反转。该算法在我们项目中应用了挺长时间(两年左右,日活百万级app),未发现碰撞及其他情况,但该算法有个缺陷,就是缺少理论支撑,难以从数学或逻辑层面证明算法的正确性。

    然后出现了第二种处理方式:直接修改SHA-256执行前的源文件,对源文件的二进制序列进行干扰。

    我们的做法是获得原文件的二进制序列之后,在头部插入特殊字符串0x00010101,然后生成新的源文件,再进行SHA-256算法运算,得到相应的key。好,下面通过公式来证明该算法的正确性:

    1.前提条件:

        a.输入字符串A != B

        b.SHA-256算法不存在碰撞性

    2.我们需要的结果是:

        A1 = SHA-256改进算法(A)

        B1 = SHA-256改进算法(B)

        A1 != B1

    3.过程:

        从前提条件可知:

        A != B (前提a)

        定义 S = 特殊字符串0x00010101

        可以得到S + A != S + B

        SHA-256(S + A)  != SHA-256(S + B)

        A1 = SHA-256改进算法(A) = SHA-256(S + A) 

        B1 = SHA-256改进算法(B) = SHA-256(S + B)       

        A1 != B1

    因此,该思路所改进的SHA-256算法是没有问题,确实可用的。

     第三种思路:是在第二种思路上的进一步加强,可以将特殊字符串的插入位置变为可变的,取原字符串的第一个Byte的值B,可能的情况有0-255,再取整个字符串的长度L,根据L及B的值,计算插入位置:

    若L>B,则插入间隔会大于等于1,为L/B

    若L<B,则表示Byte插入同一位,举个例子,L = 30,B = 255,255 / 30 = 8,则B = [0,7],均插入首位,以此类推

    这种思路也可以用第二种思路的方法来证明其正确性:

    直接看证明过程:

    假调A的第一个Byte为AB1,B的第一个Byte为BB1

    若AB1 != BB1 ,则不管后面字符串怎么插入,插入完毕的字符串均不等,最终 A1 != B1 (前提b)

    若AB1 == BB1,则A与B的插入串的位置一致,可以表述为:

    插入后的串 :AS = AF + S + AU,其中 A = AF + AU

    插入后的串 :BS = BF + S + BU,其中 B = BF + BU

    因为A != B(前提a)所以必然有AF != BF || AU != BU(注意,插入位是相同的)

    两种情况一样,随便举个例子,假设AF != BF,则不管S + AU 是否等于 S + BU,则AS != BS,继而A1 != B1

    证明完毕。

    以上算法均已在项目中完成验证。

猜你喜欢

转载自blog.csdn.net/kcstrong/article/details/81010691
今日推荐