我们正在远离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中提供的信息如下:
oli@xxx.com
$1$xxxxxxxx$
$1$xxxxxxxx$xxxxxxx
用户密码的格式为$ 1 $ xxxxxxxx $ prff0mAKPVBHNKOlRradj1 - 包含34个字符,包括预先添加的用户代码。
目前,我们通过让CF发送原始用户输入(电子邮件+密码),以及检索到的user_code(PHP用于加密crypt函数)到PHP页面来呈现密码并与之中的内容进行比较来进行身份验证。 DB。
我基本上无法确定如何使用现有的盐在CF中准确呈现用户的信息。
谢谢!
答案 0 :(得分:2)
(免责声明:我不是PHP人员。)忽略基本的字符串函数,看起来代码的关键部分涉及两个函数:md5
和crypt
。
根据我的阅读,没有内置的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结果更简单。 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