<?php
/**
*
* @author Zjmainstay
* @website http://zjmainstay.cn
* @copyright GPL
* @version 1.0
* @year 2014
*
*/
//CLI Usage: php createPassword.php length=32\&type=all\&splitChar=_\&splitLength=4\×=5
//动态关闭错误提示
ini_set('display_errors','off');
error_reporting(0);
if(isset($_GET['source'])) {
highlight_file(__FILE__);
exit;
}
//默认长度和类型
$length = 32;
$type = 'number-lower-upper';
$customType = '';
$splitChar = '';
$splitLength = 4;
$times = 1;
$isCli = (PHP_SAPI=='cli') ? true : false;
if($isCli) {
if(!empty($argv[1])) parse_str($argv[1], $_POST);
else $_POST = array(
'length' => $length,
'type' => $type,
'customType' => $customType,
'splitChar' => $splitChar,
'splitLength' => $splitLength,
'times' => $times,
);
}
if(!empty($_POST)) {
/**
* 获取随机密码函数
* @param string $type 密码字符串类型
* @param string $customStr 自定义密码组成字符
* @param int $length 密码长度
* @param string $splitChar 分隔符,默认不分隔
* @param int $splitLength 密码字符分隔长度 比如:密码为abc-def-ghi时$splitLength = 3
*
*/
function getPassword($type = 'number-lower-upper', $customStr = '', $length = 32, $splitChar = '', $splitLength = 4) {
$strArr = array(
'number' => '0123456789',
'lower' => 'abcdefghijklmnopqrstuvwxyz',
'upper' => 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
'special' => '~!@#$%^&*()_+{}|[]\-=:<>?/',
);
if($type == 'all') { //全部
$str = implode('', $strArr);
} else if($type == 'custom') { //自定义类型
if(empty($customStr)) { //未填写自定义类型,则默认为数字+大小写字母
$type = 'number-lower-upper';
} else {
$str = $customStr;
}
}
//custom 没带自定义类型 或 其他类型
if(empty($str)) {
$typeParts = explode('-', $type);
$str = '';
foreach($typeParts as $part) {
$str .= $strArr[$part];
}
}
$maxLength = 32; //最大长度
$length = empty($length) ? $maxLength : min((int)$length, $maxLength);
if(empty($length)) {
$length = $maxLength;
}
// 大数据下面str_shuffle会导致随机种子耗尽而导致结果循环(错误做法)
// $passwordStr = '';
// do {
// $randStr = str_shuffle($str);
// $passwordStr .= substr($randStr, 0, 1); //每次取一个字符
// $passwordLength = strlen($passwordStr);
// } while($passwordLength < $length);
//纠正
$passwordStr = '';
$strMaxIndex = strlen($str) - 1;
do {
$randIndex = mt_rand(0, $strMaxIndex);
$passwordStr .= $str[$randIndex]; //每次取一个字符
$passwordLength = strlen($passwordStr);
} while($passwordLength < $length);
//需要分隔
if($splitChar != '') {
$passwordStr = implode($splitChar, str_split($passwordStr, $splitLength));
}
return $passwordStr;
}
$length = empty($_POST['length']) ? $length : max(1, (int)$_POST['length']);
$type = empty($_POST['type']) ? $type : $_POST['type'];
$customType = empty($_POST['customType']) ? $customType : $_POST['customType'];
$splitChar = empty($_POST['splitChar']) ? $splitChar : $_POST['splitChar'];
$splitLength = empty($_POST['splitLength']) ? $splitLength : max(1, (int)$_POST['splitLength']);
$times = empty($_POST['times']) ? $times : min(100, max(1, (int)$_POST['times'])); //这里加了最大密码个数限制,可自行修改
$passwordArr = array();
for($i = 0; $i < $times; $i++) {
$passwordArr[] = getPassword($type, $customType, $length, $splitChar, $splitLength);
}
$password = implode("\n", $passwordArr);
if($isCli) {
echo $password;
exit;
}
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>密码生成器</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="Content-Language" content="zh-CN" />
<script type="text/javascript" src="http://www.zjmainstay.cn/jquerylib/jquery-1.8.2.min.js"></script>
</head>
<body>
<style type="text/css">
* {
margin: 5px;
}
</style>
<form action="<?php echo $_SERVER['SCRIPT_NAME']?>" method="POST">
<div>
<label>长度:</label>
<input type="text" name="length" value="<?php echo $length ?>" style="width: 100px;" placeholder="长度为0-32"/>
</div>
<div>
<label>类型:</label>
<select name="type" style="width: 150px;" id="type">
<option value="number">纯数字</option>
<option value="lower">小写字母</option>
<option value="upper">大写字母</option>
<option value="lower-upper">大小写字母</option>
<option value="number-lower">数字+小写字母</option>
<option value="number-upper">数字+大写字母</option>
<option value="number-lower-upper">数字+大小写字母</option>
<option value="special">特殊字符</option>
<option value="number-special">数字+特殊字符</option>
<option value="lower-special">小写字母+特殊字符</option>
<option value="upper-special">大写字母+特殊字符</option>
<option value="all">全部</option>
<option value="custom">自定义</option>
</select>
<input name="customType" type="text" style="display:none;" size="50" value="<?php echo $customType ?>"/>
</div>
<div>
<label>密码分隔符(不填写则不分隔)</label>
<input name="splitChar" type="text" value="<?php echo $splitChar ?>"/>
</div>
<div>
<label>密码分隔长度</label>
<input name="splitLength" type="text" value="<?php echo $splitLength ?>"/>
</div>
<div>
<label>密码个数</label>
<input name="times" type="text" value="<?php echo $times ?>"/>
</div>
<div>
<input type="submit" value="生成"/>
<?php if(!empty($password)) { ?>
<div>
<textarea id="password" readOnly="true" rows="10" cols="50"><?php echo $password ?></textarea><span class="tips"></span>
</div>
<?php } ?>
</div>
</form>
<script type="text/javascript">
$(document).ready(function(){
//初始化默认选择数字+大小写字母
$("#type").get(0).selectedIndex = $("#type option").index($("#type option[value=<?php echo $type ?>]"));
if($("#type").val() == 'custom') {
$("input[name=customType]").show();
}
$("#type").change(function() {
if($(this).val() == 'custom') {
$("input[name=customType]").show();
} else {
$("input[name=customType]").hide();
}
});
$("#password").click(function() {
$(this).select();
$(".tips").html("请使用 Ctrl + C 复制");
});
});
</script>
</body>
</html>
文件源码:PHP生成动态密码(源码)- Zjmainstay学习笔记
未经同意禁止转载!
转载请附带本文原文地址:PHP生成随机密码,首发自 Zjmainstay学习笔记




