CF8 和 AES 解密 MySQL AES:编码不同

2024-01-02

这已经成为一种练习,告诉我我做错了什么,而不是关键任务,但我仍然想看看我犯了什么(可能很简单)的错误。

我正在使用 mysql (5.1.x) AES_ENCRYPT 来加密字符串。我正在使用 CF 的generateSecretKey('AES') 来制作密钥(我已经尝试过默认长度、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>

or

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

我不断收到“输入和输出编码不相同”(包括 toString() - 如果没有,我会收到二进制数据错误)。数据库中加密字符串的字段类型是 blob。


此条目 http://info.michael-simons.eu/2011/07/18/mysql-compatible-aes-encryption-decryption-in-java/解释说 mySQL 处理 AES-128 密钥的方式与您想象的有点不同:

.. MySQL 算法只是 or 给定密码短语的字节 如果密码长度超过 16 个字符,则针对前面的字节 当密码短于 16 个字符时,将它们保留为 0。

没有经过严格测试,但这似乎产生相同的结果(以十六进制表示)。

<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>

Note:如果您使用 mySQL 进行加密,请务必查看其文档,其中提到纯文本可能最终出现在各种日志中 http://dev.mysql.com/doc/refman/5.5/en/encryption-functions.html(复制、历史等)并且“可以由任何有权读取该信息的人阅读”。


Update:情况可能已经改变,但根据2004 年的错误报告 http://bugs.mysql.com/bug.php?id=3172 the .mysql_history文件仅在 Unix 上存在。 (记住可能还有其他日志文件)清除.mysql_history的详细说明可以说明书上找到的 http://dev.mysql.com/doc/refman/5.0/en/mysql-history-file.html,但总而言之:

  • Set the MYSQL_HISTFILE变量为 /dev/null (每次登录时)
  • 创建 .mysql_history 作为 /dev/null 的符号链接(仅一次)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CF8 和 AES 解密 MySQL AES:编码不同 的相关文章

随机推荐

  • 如何从animationDidStop中删除CALayer对象?

    我正在尝试学习 iOS iPhone 的核心动画 我的根层包含很多子层 精灵 当它们被移除时它们应该旋转 我的计划是添加一个旋转动画 然后在调用animationDidStop 时删除精灵 问题是精灵层不是animationDidStop的
  • 使用 Apache Commons Math 插值函数

    我正在尝试实现一些插值函数来绘制一些值 其中 X 值 Date seconds 且 Y 值 double 我一直在研究使用Apache Commons Mathlib 来实现这一点 我找到了一种我认为可以使用的方法here http www
  • Eclipse-CDT:如何配置调试器以在出现异常时停止?

    这可能是一个 GDB 问题 但我想在调试器中运行我的应用程序 并在引发异常时让调试器中断 这样我就可以看到代码在哪里以及当时它在做什么 我经常在 Visual Studio 中使用 调试 gt 异常 对话框执行此操作 检查我想要停止的异常类
  • 有没有办法重置网络客户端?

    我在网络客户端解析一些非常敏感的网页时遇到问题 不知何故 网络客户端无法执行某些任务 我什至不知道为什么 没有例外 没有错误 只是简单地不起作用 这不是网站的问题 我循环运行 webclient 但是 只有第一个请求成功 所有接下来的请求都
  • 如何将 PdfPTable 插入现有 PDF 模板?

    Update 经过一番讨论 我们决定使用 TeX 特别是与 Windows 兼容的MiKTeX http www miktex org 我们意识到 即使我们可以通过微观管理布局来格式化动态加长表 这似乎不可能 或者与计算每行的行高一样繁琐
  • JavaFX 应该取代 Swing 吗?

    我习惯了 Swing 编程 也听说过 JavaFX 它是否应该取代 Swing 成为用 Java 编写桌面应用程序的首选平台 换句话说 我应该为我的新项目选择 JavaFX 吗 是的 JavaFX 正在取代 Swing 另请参阅Oracle
  • 文本字段、标签和按钮

    我在理解 GUI 以及为什么我的程序无法正常运行方面遇到了一些困难 是因为我必须扩展到 JFrame 类吗 这是一个代码 import java awt event ActionEvent import java awt event Act
  • 这个具有空捕获列表的 lambda 如何能够引用到达范围名称?

    在 C 14 标准 5 1 2 12 中 它显示了 lambda 表达式的示例 该表达式显然似乎能够引用到达范围的变量x 虽然 捕获列表为空 即没有捕获默认值 该评论说它 没有捕获x 这是例子 void f int const int 2
  • Emacs:定义命令输出的目标窗口

    我厌倦了 emacs 用它的输出来破坏我的窗口 而且是不可预测的 我想在 emacs 框架中有几个窗口 并且每个窗口仅用于特定目的 例如 ECB panels Editor 1 Editor 2 Bookmarks Messages out
  • Intellij 拒绝将 Kotlin 目标 jvm 设置为 1.8?

    ParallelStreams kts 41 15 error calls to static methods in Java interfaces are prohibited in JVM target 1 6 Recompile wi
  • 挂载Android模拟器创建的qcow2镜像

    我正在尝试挂载 Android 模拟器创建的 userdata qemu img qcow2 文件 以下过程不起作用 sudo qemu nbd c dev nbd0 android avd Pixel C API 27 avd userd
  • python optparse,如何在使用输出中包含附加信息?

    使用 python 的 optparse 模块 我想在常规使用输出下方添加额外的示例行 我当前的 help print 输出如下所示 usage check dell py options options h help show this
  • ES5 中的 Object.defineProperty?

    我看到关于 新 Object create 的帖子 它使枚举可配置 但是 它依赖于 Object defineProperty 方法 我找不到此方法的跨浏览器实现 我们是否还在为旧的 Object create 编写代码 我不能写在 IE6
  • 如何使用 C++ 对 Arduino 进行编程 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 最近我一直在摆弄我的 Arduino 我想知道是否有某种方法可以用 C 对 Arduino 进行编程 我一直在使用 C 对其进行编程加
  • ActiveCollab API 分页和速率限制

    我在以下位置找不到有关 API 分页或速率限制的信息 https developers activecollab com api documentation https developers activecollab com api doc
  • 如何在jquery mobile可折叠列表中添加多个图标

    我想在 jquery mobile 可折叠列表的加号图标附近添加另一个图标 但无法添加它 因为 jquery mobile 动态创建该图标 任何建议将不胜感激 这当然是一种 hack 但您可以等待页面初始化 然后找到列表视图小部件并将图标的
  • 使用 PowerShell 远程处理在活动用户会话中启动程序

    是否可以检测到特定用户在计算机上有一个打开的会话 并在该会话中打开一个进程 以便用户可以使用 PowerShell 远程处理与应用程序进行交互 我将如何检测哪些用户在计算机上打开了会话以及他们的状态 活动 空闲 断开连接等 我如何在其中一个
  • 如何在 Python 中将一维数组打印为网格?

    我有一个包含 200 个项目的数组 grid 0 0 0 0 0 0 0 0 0 0 0 0 0 0 and so on 我怎样才能像这样将它打印为二维数组 实际上每 10 个字符就分割一次 0 0 0 0 0 0 0 0 0 0 0 0
  • 如何防止 ReSharper 在添加 using 指令时缩短命名空间?

    当我使用 ReSharper 添加 using 指令 使用 Alt Enter 时 它会删除命名空间的 不必要 部分 我更喜欢使用完整的命名空间 这也是 Visual Studio 的行为 Example namespace MyCompa
  • CF8 和 AES 解密 MySQL AES:编码不同

    这已经成为一种练习 告诉我我做错了什么 而不是关键任务 但我仍然想看看我犯了什么 可能很简单 的错误 我正在使用 mysql 5 1 x AES ENCRYPT 来加密字符串 我正在使用 CF 的generateSecretKey AES