PHP crypt()和Coldfusion

时间:2016-10-11 13:22:34

标签: php mysql coldfusion coldfusion-11

我们正在远离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
  • user_code:$1$xxxxxxxx$
  • user_password:$1$xxxxxxxx$xxxxxxx

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

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

我基本上无法确定如何使用现有的盐在CF中准确呈现用户的信息。

谢谢!

1 个答案:

答案 0 :(得分:2)

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

隐窝

根据我的阅读,没有内置的PHP crypt()。但是,Apache Commons Codec库中有一个java implementation of that algorithm,可以在CF中使用。下载最新版本的Apache Commons Codec ** 。然后通过Application.cfc文件中的this.javaSettings加载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