Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/250.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 我可以使用密码\u hash()验证发件人吗?_Php - Fatal编程技术网

Php 我可以使用密码\u hash()验证发件人吗?

Php 我可以使用密码\u hash()验证发件人吗?,php,Php,我需要检查我的服务器,如果我收到一个可靠的邮件发件人。基本上,我有一个私钥,只有发送方(客户端)和接收方(服务器)知道它是什么。发送方生成一个公钥(基于私钥)并将其发送给接收方,同时执行操作。接收方检查此公钥是否有效。如果是,执行发送者想要的 我的疑问是我需要如何散列公钥。如果我需要使用一个简单的散列算法(如散列(sha256)),或者如果我可以使用密码\u散列()) 有关流程的详细信息(可选阅读): 发送方和接收方都知道私钥。发送方基于私钥、当前时间和可选附加数据生成公钥。所以它会发送到服务器

我需要检查我的服务器,如果我收到一个可靠的邮件发件人。基本上,我有一个私钥,只有发送方(客户端)和接收方(服务器)知道它是什么。发送方生成一个公钥(基于私钥)并将其发送给接收方,同时执行操作。接收方检查此公钥是否有效。如果是,执行发送者想要的

我的疑问是我需要如何散列公钥。如果我需要使用一个简单的散列算法(如
散列(sha256)
),或者如果我可以使用
密码\u散列()

有关流程的详细信息(可选阅读):

发送方和接收方都知道私钥。发送方基于私钥、当前时间和可选附加数据生成公钥。所以它会发送到服务器,并执行以下操作:

command:key = 12345678901234567890123456789012
command:timestamp = 1234567890
action:name = truncate:users
接收方将检查
command:key
是否有效,在服务器端重新生成公钥,使用相同的私钥重复发送方完成的相同过程。如果通过,它还将检查此键是否在以前使用过,以及时间戳是否最接近当前时间(以避免使用旧的有效键)。如果全部有效,则服务器将执行
操作:name
,并将响应返回给发送方

示例

Bob(客户端)希望在Alpha(服务器)上执行
截断用户
功能。 Bob知道服务器的私钥。所以他创建了一个公钥(令牌)来验证服务器上的命令

服务器将收到Bob命令,并根据服务器私钥检查您的公钥是否有效。服务器将执行Bob命令并返回一个success值


其思想不是将Bob消息加密到服务器,而是只告诉服务器他是一个值得信任的人。

如果我理解您所做的是正确的,那么是的,您可以使用
密码\u散列
。大概是这样的:

发件人:

$key = "super secret";
$timestamp = time();
$action = "truncate:users";
$signature = password_hash($key . $timestamp . $action, PASSWORD_DEFAULT);
$message = array(
  'command:key' => $signature,
  'command:timestamp' => $timestamp,
  'action:name' => $action
);
send($message);
接收人:

$message = receive();
$key = "super secret";
$valid = password_verify($key . $message['command:timestamp'] . $message['action:name'], $message['command:key']);
if ($valid) {
  //message is OK
} else {
  //something is wrong; maybe an attacker?
}

实际上,这不是公钥加密,这是消息签名,这是一个非常标准的事情。您还可以为此查看
hash_hmac
函数,或者使用OpenSSL。一般来说,这些都是更好的主意,因为如果你自己尝试去做的话,事情会更容易搞砸。

听起来你真正想要的是如何为请求计算数字签名。签名用于验证请求是否来自正确的发件人,以及消息是否未被篡改

看起来PHP通过openSSL支持签名


我建议你仔细阅读如何正确实施签名系统。很容易出错—即使专家也经常出错—因此请花时间了解您正在构建的内容和安全风险。

您永远不应该散列公钥。在二读时,我不确定你是否想发明你自己的版本。如果您确定,请查看现有的完善的工作版本基本上,我正在尝试允许我的服务器识别接收到的消息是否可信。所以我有一个私钥(只有客户机和服务器知道),所以客户机和服务器可以检查生成的公钥。我认为这个维基基本上就是我想做的,真的也许吧,除了我不想解密它,但只检查它是否可信。这并不是什么新鲜事,你最好看看公钥-私钥的实现,而不是构建你自己的。检查我的示例。我不想重新实现一个安全的协议,比如HTTPS,但要对用户进行身份验证。基本上,公钥是客户端在服务器上执行命令的“密码”。请确保在请求中包含时间戳,以防止重播攻击。签名只能解决部分can-I-trust-this-request问题。您仍然需要验证数据,并假设攻击者可以读取和重播数据。