以前注册很多网站密码都使用简单密码,但是由于今年频繁曝出密码不安全问题,所以要使用更加复杂的密码。但是好多个账号,密码也不能设置成一样的,防止一个被盗全部不安全了,记密码就成了意见很头疼的事情。
在手机上有个1password软件,非常好,不过收费的。本着节约和利用自己的技能,自己就想到开发一个加密的账号功能
在php中有个ssl 加密功能,本文就是用此功能。步骤如下
前提:什么样的秘密才安全
密码没有绝对安全的说
数字,字符,特殊字符结合,长度大于10位
定期更换密码
一:生成私钥和公钥
$config = array(
"digest_alg" => "sha512",
"private_key_bits" => 4096,
"private_key_type" => OPENSSL_KEYTYPE_RSA,
);
// Create the private and public key
$res = openssl_pkey_new($config);
// Extract the private key from $res to $privKey
openssl_pkey_export($res, $privKey);
file_put_contents("./account_private_key.pem",$privKey);
// Extract the public key from $res to $pubKey
$pubKey = openssl_pkey_get_details($res);
$pubKey = $pubKey["key"];
file_put_contents("account_public_key.pem",$pubKey);
二:加密和解密函数
//解密函数,使用生成的私钥
private function decrypt( $txt ){
$txt = base64_decode($txt);
$fp=fopen ( Yii::$app->params['account']['private_key_path'],"r");
$priv_key2=fread ($fp,8192);
fclose($fp);
$PK2=openssl_get_privatekey($priv_key2);
$ret = openssl_private_decrypt($txt,$output,$PK2);
if ( !$ret ) {
return false;
}
return $output;
}
//加密函数,使用生成的公钥
private function encrypt( $txt ){
$fp=fopen (Yii::$app->params['account']['public_key_path'],"r");
$pub_key=fread ($fp,8192);
fclose($fp);
$PK = openssl_get_publickey($pub_key);
if (!$PK) {
return false;
}
$output="";
openssl_public_encrypt($txt,$output,$PK);
if (!empty($output)) {
openssl_free_key($PK);
return base64_encode($output);
}
return false;
}
三:数据表设计
CREATE TABLE `account_list` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`title` varchar(100) NOT NULL DEFAULT '' COMMENT '标题,用于搜索',
`account` varchar(100) NOT NULL DEFAULT '' COMMENT '账号',
`password` varchar(2000) NOT NULL DEFAULT '' COMMENT '通行证密码',
`description` varchar(1000) NOT NULL DEFAULT '' COMMENT '描述',
`updated_time` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '最后一次更新时间',
`created_time` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '创建时间',
PRIMARY KEY (`id`),
KEY `idx_title` (`title`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='账户列表';
效果展示
存在数据库中的密码都是加密过的,即使得到数据库没有私钥,也无法解密
参考
随机密码生成器,点击此处
不错
回复 @ apanly: 非常不错