密钥生成器无需存储在数据库中

时间:2013-08-28 12:04:15

标签: php random key-generator

我的代码创建了随机key并将其存储在database按钮点击,keygen是按钮名称,if用户/客户已经拥有密钥在点击key的文本框中从数据库中获取else,它会生成新的key并将其存储在database中。有没有办法可以实现这一点,而无需将key存储在数据库中,并且每次都为特定用户/客户获取相同的密钥。

代码:

<?php
include('session.php');
$result = mysql_query("SELECT * FROM customer WHERE customer_no = '$customer_no'");
$row = mysql_fetch_array($result);
if (isset($_POST['keygen'])){
$customer_no = $_POST['customer_no'];
$customer_no = mysql_real_escape_string($customer_no);
$result = mysql_query("SELECT * FROM customer WHERE customer_no = '$customer_no'");
while ($row = mysql_fetch_assoc($result)) {
$keyString = $row['key'];
if($keyString == ""){
$keyString = mysql_real_escape_string($keyString);
$query = mysql_query("UPDATE customer SET `key` = '$keyString' WHERE customer_no = '$customer_no'");
}
else{
$keyString = $row['key'];
}}} 

function  generateRandomString($length = 10) {  
$characters = '23456789ABCDEFGHJKMNPQRSTUVWXYZ';
$randomString = '';
for ($i = 0; $i < $length; $i++) {
    $randomString .= $characters[rand(0, strlen($characters) - 1)];
} 
return $randomString;
}

?>

我的HTML是,

<div id="content" class="box2">
<div class="login">
<form action="" method="post" style="margin:12px;">
<table class="nostyle">
<tr>
<td align="center">
<label style="font-size:16px;"><strong>Customer ID: </strong></label>
<select name="customer_no">
<?php $result_customer= mysql_query('SELECT customer_no FROM customer ORDER BY   customer_no'); ?>
<?php while($row_customer= mysql_fetch_assoc($result_customer)) { ?>
<option <?php if ($row_customer['customer_no']=='') { ?> selected="selected"<?php } ?>> <?php echo htmlspecialchars($row_customer['customer_no']); ?> </option>
<?php } ?>
</select>
</td>
</tr>
<tr>
<td align="center"><label style="font-size:16px;"><br /><strong>Register Key: </strong> </label>
<input type="text" id="key" class="input-text" name="key" size="20" align="middle"   value = " <?=$row["key"];?>"></td>
 </tr>
 <td align="center"><br /><input type="submit" id="keygen" class="input-submit" name="keygen" value="Generate" onclick=""/>
 </td>
 </tr>
 </table>
 </form>
 </div>
 </div>

请帮忙,我是新手。

2 个答案:

答案 0 :(得分:0)

一种方法是从一个(或多个)客户属性创建哈希。 哈希是一种从源字符串创建字符串的函数。相同的源字符串将始终生成相同的哈希。

但是你必须处理哈希的两个问题:你不能从哈希生成源字符串(因为哈希算法是不可逆的),你必须处理可能的哈希冲突(两个不同的字符串生成)相同的哈希)。如果你的哈希有足够的长度(md5有32个字符,sha1长40个......),这是不太可能的。

如果您需要双向加密(从用户名获取字符串,然后从字符串生成该用户名),那么您需要查看加密技术。

查看提供许多不同加密/散列算法的mcrypt库。我相信你会找到一个适合你需求的产品。

答案 1 :(得分:0)

取决于的使用方式和内容。

如果您有固定密钥,则可以选择从customer_no以某种方式派生它。比如使用md5(),但如果你的客户编号是顺序的,那么攻击也很容易,所以使用所有不可更改的客户数据,计算会更复杂一些。然后可以针对customer表验证此md5()总和。