PHP - 将单词拆分为数组

7

我已经进行了大量的搜索,但没有找到完全符合我的需求...

我正在加强网站的身份验证。我决定获取用户凭据,并对其进行哈希/加盐处理。然后将这些值存储在数据库和用户cookie中。我修改了在PHP网站上找到的脚本,目前运行良好。然而,我注意到在使用array_rand时,它会顺序地从预定义字符串中选择字符。我不喜欢那样,所以我决定在array_rand数组上使用洗牌。效果很好。

接下来!我认为将用户输入的密码转换为数组,然后与我的加盐数组合并是个聪明的做法!然而,我在将用户密码转换为数组时遇到了麻烦。我希望他们密码中的每个字符都成为一个数组条目。例如,如果您的密码是“cool”,则数组将为Array 0 => c 1 => o 2 => o 3 => l等等。我尝试了使用word分割字符串,然后使用指定的断点字符拆分它,但没有成功。我想我可以使用for循环、strlen等方法,但一定有更优雅的方式。

有什么建议吗?我有点困惑:( 这是我目前的进展,我还没有完成,因为我还没有超过explodey部分。

$strings = wordwrap($string, 1, "|");
echo $strings . "<br />";
$stringe = explode("|", $strings, 1);
print_r($stringe);
echo "<br />";
echo "This is the exploded password string, for mixing with salt.<hr />";

非常感谢您 :)
3个回答

23

你想要的php函数是str_split。

str_split('cool', 1);

并且它将返回,如上所述使用

[0] => c
[1] => o
[2] => o
[3] => l

这个完美地运行了!非常感谢你,Colum!总是有东西可以学习 :) 给你传递好的 (((vibes)))! - Shawn
1
大家也不要使用 explode 函数,因为它无法处理空分隔符 :) 只是想提一下。 - Tilak Madichetti

3

由于PHP具有松散的类型,如果您将字符串视为数组,则PHP将会如您所预期地执行。例如:

$string = 'cool';
echo $string[1]; // output's 'o'.

1
这与松散类型无关,它只是称为子字符串访问,并且不应该被误认为是数组。 - hakre
嘿bulk,谢谢你的信息。我确实尝试过那个方法,但是将单词拆分成一个真正的数组以供array_rand使用并不是很顺利。除非array_rand可以将字符串视为数组...但我认为它不会这样做。无论如何,感谢你的信息 :) - Shawn
抱歉,发了两次消息,希望我能编辑一下。我是指的array_merge函数。Urf - Shawn

3

永远不要(甚至是在设计时)实现密码算法,除非你确实知道自己在做什么。如果你还是决定要这样做,那么你就会让你的网站处于风险之中。 其实没有必要这样做:肯定已经有库和/或函数可以完成所有这类事情。


嘿,谢谢你提醒我。我最终将使用MD5来哈希混合的盐/密码。计划是创建一个盐,混合密码,对盐进行MD5哈希,对密码进行MD5哈希,然后将每个哈希值放在一起并对该字符串进行哈希,然后将其用作数据库凭据/cookie凭据。我希望这将防止针对使用常见密码和/或用户名的用户的彩虹表攻击。然后,我最终希望能够实现SSL/TLS以保护cookie详细信息的传输,以防止中间人攻击。听起来还可以吗?谢谢 :) - Shawn
我听说MD5因为不断增强的威胁而不再被推荐使用。我也听说SHA1也是一样。你会推荐SHA256吗?不过,难道不是MD5唯一的固有弱点就是用户输入本身就较弱吗?这就是为什么我打算使用30个字符的盐值。虽然我并不是专家。但我一直在学习! - Shawn
你说得很有可能是对的。我并不是一个密码学专家,所以无法评论SHA256,但根据我所了解的,MD5并不是非常“抗碰撞”的。简单来说,想象一下一个产生单比特哈希(0或1)的哈希算法。由于只有两个可能的哈希值和无限数量的输入,会有许多碰撞。碰撞抵抗力指的是任何类型的输入都具有相等(或接近)数量的“0哈希”和“1哈希”。而MD5则没有这种属性。这篇论文概述了这种漏洞。 - user836352
1
@Shawn:如需了解如何安全存储密码的简明文章,请参阅http://codahale.com/how-to-safely-store-a-password/(然后在此处获取PHP的bcrypt实现http://www.openwall.com/phpass/)。当您需要帮助用户创建强密码时,请参阅XKCD http://xkcd.com/936/。 - nikc.org

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接