PHP crypt() 和 Coldfusion

PHP crypt() and Coldfusion

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

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

有了我知道的盐和加密密码,我希望能够 "rebuild" 用户在 CF 中输入的 34 个字符串,与数据库中存储的内容进行比较。

到目前为止,我在 CF 中尝试过的任何事情都不允许我 "rebuild" 结果 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 = "$".str_pad(substr($user_salt, 0, 8), 8, '0', STR_PAD_LEFT)."$";
        }
        else
        {   
            $user_salt = "$".substr($user_salt, 0, 8)."$";
        }
        $pass_to_use = crypt($password, $user_salt);
    }
    echo $pass_to_use;
?>

我们在 MySQL 数据库中可用的信息如下:

用户密码的形式为 $1$xxxxxxxx$prff0mAKPVBHNKOlRradj1 - 34 个字符,包括前置的用户代码。

目前,我们通过让 CF 发送原始用户输入(电子邮件 + 密码)以及检索到的 user_code(PHP 用于对 crypt 函数加盐)来进行身份验证 PHP 页面以呈现密码并与数据库中的内容进行比较。

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

谢谢!

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

地穴

根据我的阅读,没有内置等效于 PHP 的 crypt(). However, there is a java implementation of that algorithm in the Apache Commons Codec library, which can be used from CF. Download the latest version of Apache Commons Codec **. Then load the jar via this.javaSettings in your Application.cfc file. Once loaded, you can create an instance of the Md5Crypt class 并生成散列。

冷聚变:

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

PHP:

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

结果:

$ISzYi6zf$lqApYqSEt9fzpSDEZxuK00 

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

MD5

复制 md5 结果更简单。 CF 中的等效函数是 Hash(). The only difference being CF converts the result to upper case. Use LCase() 以匹配 PHP 结果:

冷聚变:

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