我想在php中生成一个随机密码.
但是我得到所有'a'并且返回类型是数组类型,我希望它是一个字符串.有关如何更正代码的任何想法?
谢谢.
function randomPassword() {
$alphabet = "abcdefghijklmnopqrstuwxyzABCDEFGHIJKLMNOPQRSTUWXYZ0123456789";
for ($i = 0; $i < 8; $i++) {
$n = rand(0, count($alphabet)-1);
$pass[$i] = $alphabet[$n];
}
return $pass;
}
Run Code Online (Sandbox Code Playgroud) 我想生成忘记密码的标识符.我读过我可以通过使用带有mt_rand()的时间戳来做到这一点,但有些人说时间戳可能不是每次都是唯一的.所以我在这里有点困惑.我可以使用时间戳吗?
问题
生成自定义长度的随机/唯一标记的最佳做法是什么?
我知道这里有很多问题,但是在阅读了不同的人的不同意见后,我变得更加困惑.
我正在寻找生成随机/唯一字符串的最短方法,为此我使用了以下两个:
$cClass = sha1(time());
Run Code Online (Sandbox Code Playgroud)
要么
$cClass = md5(time());
Run Code Online (Sandbox Code Playgroud)
但是,我需要字符串以字母字符开头,我正在查看base64编码,但最后会添加==,然后我需要摆脱它.
用一行代码实现这一目标的最佳方法是什么?
更新:
PRNDL提出了一个很好的建议,我最终使用它,但有点修改
echo substr(str_shuffle(abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ),0, 1) . substr(str_shuffle(aBcEeFgHiJkLmNoPqRstUvWxYz0123456789),0, 31)
Run Code Online (Sandbox Code Playgroud)
将产生32个字符来模仿md5哈希,但它总是会产生第一个字母字母,就像这样;

然而,Uours真的改进了他的答案;
substr(str_shuffle("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), 0, 1).substr(md5(time()),1);
Run Code Online (Sandbox Code Playgroud)
更短,更甜
Anonymous2011的另一个建议非常棒,但由于某种原因,第一个角色总是要么M,N,Y,Z所以不适合我的目的但是会选择答案,顺便说一下有谁知道为什么它会总是产生那些特定的字母?
这是我修改版本的预览
echo rtrim(base64_encode(md5(microtime())),"=");
Run Code Online (Sandbox Code Playgroud)

使用案例:"我忘了密码"按钮.我们找不到用户的原始密码,因为它以散列形式存储,因此唯一要做的就是生成一个新的随机密码并通过电子邮件发送给他.这需要加密不可预测的随机数,mt_rand不够好,通常我们不能假设托管服务将提供访问操作系统以安装加密随机数模块等所以我正在寻找一种方法在PHP本身生成安全的随机数.
到目前为止我提出的解决方案涉及存储初始种子,然后为每次调用,
result = seed
seed = sha512(seed . mt_rand())
Run Code Online (Sandbox Code Playgroud)
这是基于SHA512哈希函数的安全性(该mt_rand电话只是为了让生活多一点对谁获得数据库的副本对手困难).
我错过了什么,还是有更好的解决方案?
我想将文件中的所有变量重命名为随机名称.
例如:
$example = "some $string";
function ($variable2) {
echo $variable2;
}
foreach ($variable3 as $key => $var3val) {
echo $var3val . "somestring";
}
Run Code Online (Sandbox Code Playgroud)
会变成这样的:
$frk43r = "some $string";
function ($izi34ee) {
echo $izi34ee;
}
foreach ($erew7er as $iure7 => $er3k2) {
echo $er3k2 . "some$string";
}
Run Code Online (Sandbox Code Playgroud)
它看起来不那么容易,所以任何建议都会有所帮助.
每当有人访问我想在我的网站上创建一个随机序列.
串口的格式应为XXXXX-XXXXX-XXXXX-XXXXX.
X表示随机数或大写字母.
不幸的是我不知道该怎么做.有人可以帮帮我吗?
因此,例如随机串行输出可能是:3WT4A-NB34O-JU87P-B3UHS非常
感谢!
如何创建随机文本字符串以用于文件名?
我正在上传照片并在完成后重命名.所有照片都将存储在一个目录中,因此它们的文件名必须是唯一的.
有这样做的标准方法吗?
有没有办法在尝试覆盖之前检查文件名是否已经存在?
这是为了一个单一的用户环境(我自己)在我的网站上显示我的个人照片,但我想自动化一点.我不需要担心两个用户同时尝试上传和生成相同的文件名,但我确实想检查它是否已经存在.
我知道如何上传文件,我知道如何生成随机字符串,但我想知道是否有一种标准的方法.
我在用:
\n\n random_bytes(30);\nRun Code Online (Sandbox Code Playgroud)\n\n为我的程序生成一个随机字符串。然后将该字符串存储在 mysql 数据库中。但是,当我运行该函数时,我得到一个输出,例如
\n\nT\xef\xbf\xbd\xd4\xb8\xef\xbf\xbd@(\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbdm\nRun Code Online (Sandbox Code Playgroud)\n\n其中包括不可读的字符。当我尝试将其存储在数据库中时,\xef\xbf\xbd 字符未存储,因此这意味着该字符串未正确保存。
\n\n我怎样才能让它返回一个只包含可读字符的字符串,并且不会在我的 mysql 数据库中丢失?
\n\n谢谢!
\n更新:
23.02.2020:该错误已在PHP 7.4.3 中修复。
23.12.2019:我发现了哪些密码受到影响。看我下面的回答。仍然非常感谢为什么拒绝长密码的答案。
免责声明:我已经尝试了大约 2 个小时,只是设置了不同的密码。我绝对相信下面的密码会导致问题。它适用于其他密码。我知道如何修复它:使用不同的密码。我想知道为什么它不起作用。因为这种不一致是不可接受的。
我能够在我的系统上重现该问题。
最近切换到 PHP 7.4 和 MySQL 8,默认情况下使用caching_sha2_password. 在验证它实际上受 PHP 支持后,我无法使用随机生成的密码使其工作,因此我mysql_native_password再次使用 PHP 7.3 。
现在,我设置了一个新服务器并且它工作正常,所以我试图找出问题所在,以便我可以caching_sha2_password在我的其他服务器上使用。
MySQL(通过 mysql shell 使用root)
ALTER USER 'test'@'localhost' IDENTIFIED WITH caching_sha2_password BY '';
FLUSH PRIVILEGES;
QUIT
Run Code Online (Sandbox Code Playgroud)
PHP
const DB_HOST = '127.0.0.1';
const DB_USERNAME = 'test';
const DB_PASSWORD = '';
const DB_NAME = 'test_db';
$mysqli = new mysqli(DB_HOST, DB_USERNAME, DB_PASSWORD, DB_NAME);
Run Code Online (Sandbox Code Playgroud)
测试(重现)
php db.php
Run Code Online (Sandbox Code Playgroud)
错误 …