ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

CF8和AES解密MySQL AES:编码不一样

2019-06-21 00:02:46  阅读:255  来源: 互联网

标签:mysql coldfusion encryption aes coldfusion-8


对于我做错的事情而言,这已经成为一种锻炼,而不是关键任务,但我仍然希望看到我正在犯的错误(简单可能).

我正在使用mysql(5.1.x)AES_ENCRYPT来加密字符串.我正在使用CF的generateSecretKey(‘AES’)来创建一个密钥(我已经在defaul和128和256位长度上尝试过它).

所以让我们说我的代码看起来像这样:

    <cfset key = 'qLHVTZL9zF81kiTnNnK0Vg=='/>
    <cfset strToEncrypt = '4111111111111111'/>
    <cfquery name="i" datasource="#dsn#">
        INSERT INTO table(str) 
            VALUES AES_ENCRYPT(strToEncrypt,'#key#');
    </cfquery>

这按预期工作正常,我可以使用SELECT AES_DECRYPT(str,’#key#’)AS来选择它…完全没有问题.

我似乎无法做的是让CF使用以下内容解密它:

    <cfquery name="s" datasource="#dsn#">
        SELECT str
          FROM table
    </cfquery>
    <cfoutput>#Decrypt(s.str,key,'AES')#</cfoutput>

要么

    <cfoutput>#Decrypt(toString(s.str),key,'AES')#</cfoutput>

我一直得到“输入和输出编码不一样”(包括toString() – 没有我得到二进制数据错误). db中加密字符串的字段类型是blob.

解决方法:

This entry解释了mySQL处理AES-128密钥的方式与您预期的有所不同:

.. the MySQL algorithm just or’s the bytes of a given passphrase
against the previous bytes if the password is longer than 16 chars and
just leaves them 0 when the password is shorter than 16 chars.

没有高度测试,但这似乎产生相同的结果(十六进制).

<cfscript>
    function getMySQLAES128Key( key ) {
        var keyBytes   = charsetDecode( arguments.key, "utf-8" );
        var finalBytes = listToArray( repeatString("0,", 16) );

        for (var i = 1; i <= arrayLen(keyBytes); i++) {
            // adjust for base 0 vs 1 index
            var pos = ((i-1) % 16) + 1;
            finalBytes[ pos ] = bitXOR(finalBytes[ pos ], keyBytes[ i ]);
        }

        return binaryEncode( javacast("byte[]", finalBytes ), "base64" );
    }

    key     = "qLHVTZL9zF81kiTnNnK0Vg==";
    input   = "4111111111111111";

    encrypted = encrypt(input, getMySQLAES128Key(key), "AES", "hex");
    WriteDump("encrypted="& encrypted);

    // note: assumes input is in "hex". either convert the bytes 
    // to hex in mySQL first or use binaryEncode
    decrypted = decrypt(encrypted, getMySQLAES128Key(key), "AES", "hex");
    WriteDump("decrypted="& decrypted);
</cfscript>

注意:如果您使用mySQL进行加密,请务必查看其文档,其中提及the plain text may end up in various logs(复制,历史记录,etectera)和“可能由具有该信息读取权限的任何人阅读”.

更新:事情可能已经改变,但根据this 2004 bug report,.mysql_history文件仅在Unix上. (请记住可能有其他日志文件)清除.mysql_history的详细说明可以是found in the manual,但总结如下:

  • Set the MYSQL_HISTFILE variable to /dev/null (on each log in)
  • Create .mysql_history as a symbolic link to /dev/null (only once)

标签:mysql,coldfusion,encryption,aes,coldfusion-8
来源: https://codeday.me/bug/20190620/1249405.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有