打造 PHP版本 1password
以前注册很多网站密码都使用简单密码,但是由于今年频繁曝出密码不安全问题,所以要使用更加复杂的密码。但是好多个账号,密码也不能设置成一样的,防止一个被盗全部不安全了,记密码就成了意见很头疼的事情。
在手机上有个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='账户列表';
效果展示
存在数据库中的密码都是加密过的,即使得到数据库没有私钥,也无法解密
参考
随机密码生成器,点击此处