【问题标题】:PHP crypt() and ColdfusionPHP crypt() 和 Coldfusion
【发布时间】:2016-10-12 07:38:40
【问题描述】:

我们正在从 PHP 和 MySQL 迁移到纯 CF/MSSQL 平台,我想把我们的用户帐户从 MySQL 带走。

用户帐户最初是在 PHP/MySQL 站点上创建的,并使用 8 个字符的盐和 MD5 加密的密码存储,如下所示:

  • 用户代码:ISzYi6zf
  • 密码:$1$ISzYi6zf$prff0mAKPVBHNKOlRradj1

有了我知道的 salt 和加密密码,我希望能够从 CF 中的用户输入“重建”34 个字符串,以与数据库中存储的内容进行比较。

到目前为止,我在 CF 中尝试过的任何事情都无法让我“重建”结果 34 个字符的字符串,以便我可以将它们与数据库中的内容进行比较,即。我正在寻找用户输入,向其中添加已知的盐,并提出一个 34 个字符的字符串以便比较它们。

感谢您的帮助!

更新:

@Leigh,这是 PHP 用来验证的代码:

<?
    $user_salt = $_POST["user_salt"];
    $password = $_POST["password"];
    $pass_meth = $_POST["pass_meth"];
    if(strlen($user_salt) > 8 && $pass_meth > 0)
    {
        list($salt1, $salt2) = str_split($user_salt, ceil(strlen($user_salt) / 2));
            $salty_password = $salt1.$password.$salt2;
        $pass_to_use =  md5($salty_password);   
    }
    else
    {
        if(strlen($user_salt) > 8)
        {
            $user_salt = "$1$".str_pad(substr($user_salt, 0, 8), 8, '0', STR_PAD_LEFT)."$";
        }
        else
        {   
            $user_salt = "$1$".substr($user_salt, 0, 8)."$";
        }
        $pass_to_use = crypt($password, $user_salt);
    }
    echo $pass_to_use;
?>

我们在 MySQL DB 中可用的信息如下:

  • user_email:oli@xxx.com
  • 用户代码:$1$xxxxxxxx$
  • 用户密码:$1$xxxxxxxx$xxxxxxx

用户密码的格式为 $1$xxxxxxxx$prff0mAKPVBHNKOlRradj1 - 34 个字符,包括附加的用户代码。

目前,我们通过让 CF 将原始用户输入(电子邮件 + 密码)以及检索到的 user_code(PHP 用来对 crypt 函数加盐)发送到 PHP 页面来呈现密码并与数据库。

我基本上不知道如何使用现有的 salt 在 CF 中准确呈现用户信息。

谢谢!

【问题讨论】:

  • 为什么不直接导出(db)数据然后导入呢?不应该有任何损失/问题
  • 另外,您能否给我们一个完整的示例(代码、纯文本、盐、散列结果),使用虚拟/丢弃值进行比较?
  • @Fred-ii-,我们的计划是将数据移动到 MS-SQL 服务器并完全转储 PHP/MySQL;我们希望完整地移动数据,并计划针对相同的数据进行身份验证,但使用 CF 而不是 PHP
  • @Leigh 这是 PHP 用来验证的代码:

标签: php mysql coldfusion coldfusion-11


【解决方案1】:

(免责声明:我不是 PHP 人)。忽略基本的字符串函数,代码的关键部分似乎涉及两个函数:md5crypt

地穴

根据我的阅读,没有内置相当于 PHP 的crypt()。但是,Apache Commons Codec 库中有一个java implementation of that algorithm,可以从 CF 中使用。下载最新版本的Apache Commons Codec**。然后通过 this.javaSettings 在 Application.cfc 文件中加载 jar。加载后,您可以创建Md5Crypt class 的实例并生成哈希。

ColdFusion:

Md5Crypt = createObject("java", "org.apache.commons.codec.digest.Md5Crypt");
salt = "$1$ISzYi6zf$";
data = charsetDecode("some value to hash here", "utf-8");
result = Md5Crypt.md5Crypt(data, salt);
writeDump( Md5Crypt.md5Crypt(data, salt) );

PHP:

$salt = "$1$"."ISzYi6zf"."$";    
$data = "some value to hash here";
$result = crypt($data , $salt);
echo $result;

结果:

$1$ISzYi6zf$lqApYqSEt9fzpSDEZxuK00 

** Apache Commons Codec 与 CF 捆绑在一起。但是,捆绑的 jar 包含一个缩小版本,缺少 MD5Crypt 类。

MD5

复制 md5 结果更简单。 CF 中的等效函数是Hash()。唯一的区别是 CF 将结果转换为大写。使用LCase()匹配PHP结果:

ColdFusion:

salt1 = "ISzYi";
salt2 = "6zfXX";
password = "some value to hash here";
WriteOutput( lcase(hash(salt1 & password & salt2)) );

PHP:

$salt1 = "ISzYi";
$salt2 = "6zfXX";
$password = "some value to hash here";
echo( md5($salt1.$password.$salt2) );

结果:

c23d4661e1ef7866a4296658e3335dbc

【讨论】:

  • Leigh,这个真的很全面,谢谢!我将尝试此代码并报告!
  • 这真的很好用!只需以下代码,并从 MySQL 数据库返回适当的 MD5 加密密码: Md5Crypt = createObject("java", "org.apache.commons.codec.digest.Md5Crypt");盐=我的代码;数据 = charsetDecode(mypass, "utf-8");结果 = Md5Crypt.md5Crypt(数据,盐);

    再次MD5结果:#result#

  • (编辑)太好了!很高兴它成功了。我想你可能已经解决了 md5 部分,但认为一个完整的例子可能会帮助下一个人:-)
  • 顺便说一句,当您说“以下 .. 是所需要的全部”时,我假设您的意思是 else php 函数的一半,对吧?由于代码似乎根据盐的长度和方法参数执行不同的操作。所以完全复制它需要 crypt() 和 md5()。
  • 我们正在迁移的身份验证机制在过去 10 年中使用了两种方法;最初使用的是 crypt() 方法,然后他们在大约 6 年前切换到 MD5 方法,这意味着我们必须构建一个开关来检查用户链接到哪种身份验证方法;所以是的,MD5 和 Crypt 方法都被使用了,但不是针对同一个用户。
猜你喜欢
  • 2012-05-04
  • 1970-01-01
  • 1970-01-01
  • 2013-05-05
  • 2012-02-04
  • 2023-03-11
  • 1970-01-01
  • 1970-01-01
  • 2011-01-12
相关资源
最近更新 更多