Javascript进行表单RSA加密算法 2

本文介绍了一个使用JavaScript进行RSA加密的注册表单流程。在不使用SSL的情况下,通过在表单提交前加密username、加timestamp和SHA1哈希后的password,确保数据安全。加密步骤包括:将表单按钮点击事件绑定到加密函数,计算password的SHA1哈希,用系统公钥加密timestamp和哈希值,最后提交加密后的表单。服务器端接收到数据后,使用私钥解密并解析信息,将数据插入数据库。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这个是我的注册page其实和login page 差不多。

Register: Client -->Server: username, P<timestamp, H<password>>

一个普通的表单如果直接submit会直接发送明文 不能加密 这样很不安全。在不能实用SSL的情况下 ,我们要在表单发送之前进行加密。 

Encrypt: 首先要把表单里的内容传到函数里进行加密: Javascript, HTML

1.把表单数据的button设置 onclick到一个我处理加密的函数senddata();

2.把密码用SHA1计算出hash值 H<password>.

3.把timestamp和密码的hash值用系统的公钥加密 P<timestamp,H<password>>

4.Submit 表单 

Decrypt: server接到数据后用私钥解密

1.解密后的信息分解成timestamp和H<psw>.

2.把数据插入数据库里。

<?php
/*
CS683 Step 6 
   Multi-user server:
   register page:
   1. Connect to database.
   2. Deal with data.
   2. Insert new user to database.
*/

if(($_POST['username'])&&($_POST['password'])){

	//1. Connect to database.
	$con = mysql_connect("localhost","root","");
	if (!$con)
	  {
	  die('Could not connect: ' . mysql_error());
	  }
	mysql_select_db("userdatabase", $con);

	//2.Set up for information
	// get sending username
	$username = $_POST['username'];

	//get private key and decrypt send password field.
	$prifile = file_get_contents('./private.pem');
	$prikey = openssl_pkey_get_private($prifile);
	openssl_private_decrypt(base64_decode($_POST['password']),$newmessage,$prikey);

	//newmessage is the decrpt mesaage. Split into timestamp and sendhpsw
	$ents= substr($newmessage, 0, 13);
	$sendhpsw = substr($newmessage, 13);

	//3. Insert new user to database.
	$r = mysql_query("INSERT INTO user(name, password, times) VALUES ('$username', '$sendhpsw', '$ents')");
	if(!$r)
		echo "please enter again!This username exists.";
}

?>


<html>

<body>


<script type="text/javascript" src="jsbn.js"></script>
<script type="text/javascript" src="rsa.js"></script>
<script type="text/javascript" src="sha1.js"></script>
<script type="text/javascript">

//Encrypt data and then submit.
function senddata(event)
{	
	
	//1.Set up for encrypt: get publickey, get form data, H<pwd>, get timestamp.
	var pubkeyfile = "-----BEGIN PUBLIC KEY-----MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDcl8ReQc+jTLplbTs2lHhtjAs2h4PM79/vYoqnTQji2Rj05NF2kbM1/e3ZKUK1cIpDnwm9lZG4OS56G+zbj/KfUyj80PmXu5vtgzSc9UZBRdfkdvj0PChmGWBsNk4Q+RwPKFsPVu1P026iNfwhbj89icooZsPITTtEu9wIF+LC0QIDAQAB-----END PUBLIC KEY-----";

	var pubkey = RSA.getPublicKey(pubkeyfile); 
	var getpwd = document.getElementById("password");
	var hpwd = sha1(getpwd.value);
	var now = new Date();
	var timestamp = String(now.getTime());
	var data = timestamp + hpwd;
	
	//2.Encrypt P <H(pwd),TS>.
	
	getpwd.value = RSA.encrypt(data, pubkey);

	//3. post data
	document.loginform.submit();
}
</script>

<h1>Registration for new user</h1>

<form name = "loginform" method="post">
username: <input id = "username" type="text" name="username" />
password: <input id = "password" type="password" name="password" />
<input type="button" value="register" onclick = "senddata(event)" />
</form>

<a href="login.php">Click here to login!!</a>

</body>



</html>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值