【发布时间】:2016-02-25 11:58:48
【问题描述】:
我正在做一个登录系统。 我希望客户端加密(使用他的私钥)来自服务器的随机消息并将结果发送到服务器。然后服务器将使用公钥解密消息并进行比较。
我已经尝试过 jsencrypt。我有一个密码结果,但我不能使用 openssl_public_decrypt 解密,但它不工作
请指教或帮助!!!
这是完成 javascript 加密的文件
<?php
//Génération d'un message aleatoires
$i = 4;
global $bytes;
$bytes = openssl_random_pseudo_bytes($i, $cstrong);
$hex = pack('H*', bin2hex($bytes));;
$username = $_POST["username"];
$password = $_POST["password"];
echo '<!DOCTYPE html>
<html>
<head>
<title>Accueil</title>
<script language="javascript">
function controle(form1, n) {
if(n == 0){
var pub = document.form1.clepub.value;
var fso = new ActiveXObject("Scripting.FileSystemObject");
// 2=overwrite, true=create if not exist, 0 = ASCII
var varFileObject = fso.OpenTextFile(pub, 1, false, 0);
//varFileObject.write("File handling in Javascript");
var s = varFileObject.ReadAll();
varFileObject.close();
return s;
}
else{
var priv = document.form1.clepriv.value;
var fso = new ActiveXObject("Scripting.FileSystemObject");
// 2=overwrite, true=create if not exist, 0 = ASCII
var varFileObject = fso.OpenTextFile(priv, 1, false, 0);
//varFileObject.write("File handling in Javascript");
var s = varFileObject.ReadAll();
varFileObject.close();
return s;
}
//alert("La clé privée est : " + s);
}
</script>
<script src="jquery-1.12.1.min.js"></script>
<script src="jsencrypt-master/bin/jsencrypt.js"></script>
<script language="javascript">
function chiffrer() {
document.getElementById("testme").style.visibility="hidden";
// Encrypt with the public key...
var encrypt = new JSEncrypt();
encrypt.setPublicKey(controle(form1, 1));
//alert(controle(form1, 1));
var encrypted = encrypt.encrypt("'.$hex.'");
document.getElementById("submit").style.visibility="visible";
document.getElementById("input").value = encrypted;
//alert(encrypted);
//document.getElementById("input").value = encryptedb64tohex(encrypted);
}
</script>';
echo '</head>
<body>
<h1>Bienvenue sur TelGov</h1>
<h2>Engager votre clef privee</h2>
<form action="compare.php" method="POST" name = "form1">
<!--<label for="clepub">Engager votre clef publique</label>
<input name="clepub" id="clepub" type="file"></input>
<label for="clepriv">Engager votre clef privee</label>-->
<input name="clepriv" id="clepriv" type="file"></input>
<br/><br/>
<input name="hash" id="hash" type="hidden" value="'.$hex.'"></input>
<br/><br/>
<input id="input" name="input" type="hidden" ></input><br/>
<input id="testme" type="button" value="Engager" onclick="chiffrer()" /><br/>
<input type="hidden" name="username" value="'.$username.'">
<input type="hidden" name="password" value="'.$password.'">
<!--<br/><br/>
<input type="button" name="bouton" value="Controler" onClick="controle(form1)">
<br/><br/>-->
<input type="submit" id = "submit" value="Se connecter" style="visibility: hidden;"</input>
</form>
</body>
</html>';
?>
这是对比代码
<?php
try{
$bdd = new PDO('mysql:host=localhost;dbname=authentification', 'root', '');
}
catch (Exception $e){
die('Erreur : ' . $e->getMessage());
}
$username = $_POST['username'];
$password = $_POST['password'];
$config = array(
"config" => "C:/wamp/bin/apache/apache2.4.9/conf/openssl.cnf",
"digest_alg" => "sha512",
"private_key_bits" => 1024,
"private_key_type" => OPENSSL_KEYTYPE_RSA,
);
if(isset($_POST['input'])&&isset($_POST['hash'])){
$crypt = $_POST['input'];
$bon = $_POST['hash'];
$cle = $bdd->prepare("SELECT publicKey FROM utilisateurs WHERE username =? AND password=?");
$cle->execute(array($username, $password));
$tmp = $cle->fetch();
var_dump($tmp['publicKey']);
var_dump($bon);
//var_dump(openssl_private_decrypt(base64_decode($crypt), $decrypted, $tmp['privateKey']/*openssl_pkey_get_private($tmp['privateKey'], null)*/));
var_dump(openssl_public_decrypt (base64_decode($crypt)/*$crypt*/, $decryted, $tmp['publicKey']));
var_dump($decryted);
var_dump(base64_decode($crypt));
if($decryted == $bon){
//header("Location:Accueil.php");
echo "Bon";
}
else{
//header("Location:index.php");
echo "Mauvais";
}
}
else{
header("Location:index.php");
}
?>
这是比较结果
【问题讨论】:
-
你的问题是?
-
你能给我一些建议吗?
-
我试过 jsencrypt。我有一个密码结果,但我不能使用 openssl_public_decrypt 解密,但它不工作
-
什么不起作用?给我们举个例子。
-
在双方提供您的代码,以及任何错误日志、要加密/解密的数据样本、您使用的密钥、生成的加密数据、生成的解密数据以及任何其他相关细节。 “它不起作用”与您在不提供任何进一步细节的情况下告诉您的医生“它很痛”一样有用。
标签: javascript php