PHP crypt() 和 Coldfusion
PHP crypt() and Coldfusion
我们正在从 PHP 和 MySQL 转移到纯 CF/MSSQL 平台,我想带走我们的用户帐户,从 MySQL。
用户帐户最初是在 PHP/MySQL 站点上创建的,并使用 8 个字符的 salt 和 MD5 加密的密码存储,如下所示:
- 用户代码:
ISzYi6zf
- 密码:
$ISzYi6zf$prff0mAKPVBHNKOlRradj1
有了我知道的盐和加密密码,我希望能够 "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 数据库中可用的信息如下:
- user_email:
oli@xxx.com
- user_code:
$xxxxxxxx$
- user_password:
$xxxxxxxx$xxxxxxx
用户密码的形式为 $1$xxxxxxxx$prff0mAKPVBHNKOlRradj1 - 34 个字符,包括前置的用户代码。
目前,我们通过让 CF 发送原始用户输入(电子邮件 + 密码)以及检索到的 user_code(PHP 用于对 crypt 函数加盐)来进行身份验证 PHP 页面以呈现密码并与数据库中的内容进行比较。
我基本上不知道如何使用现有的 salt 在 CF 中准确呈现用户信息。
谢谢!
(免责声明:我不是 PHP 人)。 忽略基本的字符串函数,看起来代码的关键部分涉及两个函数:md5
和 crypt
.
地穴
根据我的阅读,没有内置等效于 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
我们正在从 PHP 和 MySQL 转移到纯 CF/MSSQL 平台,我想带走我们的用户帐户,从 MySQL。
用户帐户最初是在 PHP/MySQL 站点上创建的,并使用 8 个字符的 salt 和 MD5 加密的密码存储,如下所示:
- 用户代码:
ISzYi6zf
- 密码:
$ISzYi6zf$prff0mAKPVBHNKOlRradj1
有了我知道的盐和加密密码,我希望能够 "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 数据库中可用的信息如下:
- user_email:
oli@xxx.com
- user_code:
$xxxxxxxx$
- user_password:
$xxxxxxxx$xxxxxxx
用户密码的形式为 $1$xxxxxxxx$prff0mAKPVBHNKOlRradj1 - 34 个字符,包括前置的用户代码。
目前,我们通过让 CF 发送原始用户输入(电子邮件 + 密码)以及检索到的 user_code(PHP 用于对 crypt 函数加盐)来进行身份验证 PHP 页面以呈现密码并与数据库中的内容进行比较。
我基本上不知道如何使用现有的 salt 在 CF 中准确呈现用户信息。
谢谢!
(免责声明:我不是 PHP 人)。 忽略基本的字符串函数,看起来代码的关键部分涉及两个函数:md5
和 crypt
.
地穴
根据我的阅读,没有内置等效于 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