我可以使用password_hash()来验证发件人吗?

时间:2015-07-12 04:07:40

标签: php

如果收到发件人的可信消息,我需要检查我的服务器。基本上我有一个私钥,只有发件人(客户端)和接收器(服务器)知道是什么。发件人生成公钥(基于私钥)并将其发送给Receiver,并执行操作。 Receiver检查此公钥是否有效。如果是,请执行Sender想要的内容。

我怀疑这是我需要哈希的公钥。如果我需要使用简单的哈希算法(例如hash(sha256)),或者我可以使用password_hash()

有关流程的更多信息(可选阅读):

发件人和收件人知道私钥。发件人根据私钥,当前时间和可选的附加数据生成公钥。所以它通过动作发送到服务器,所以我发送类似的东西:

command:key = 12345678901234567890123456789012
command:timestamp = 1234567890
action:name = truncate:users

Receiver将检查command:key是否有效,在服务器端重新生成公钥,使用相同的私钥重复发件人完成的相同过程。如果它通过,它也将检查以前是否使用过该密钥,以及时间戳是否最接近当前时间(以避免使用较旧的有效密钥)。如果all都有效,那么action:name将由服务器执行,并且响应将返回给发件人。

示例

  

Bob (客户端)希望在 Alpha (服务器)上执行truncate-users功能。   Bob知道服务器私钥。因此,他创建了一个公钥(令牌)来验证服务器上的命令。

     

服务器将接收Bob命令,并根据服务器私钥检查您的公钥是否有效。它是怎么回事,所以服务器将执行Bob命令并返回成功值。

这个想法不是将Bob消息加密到服务器,而只是告诉服务器他是一个可靠的人。

2 个答案:

答案 0 :(得分:1)

如果我理解你正在做什么,那么是的,你可以使用password_hash。像这样:

发信人:

$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。一般来说,这些都是更好的想法,因为如果你自己尝试这样做,它会更容易搞砸。

答案 1 :(得分:1)

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

看起来PHP支持通过openSSL签名

我建议您阅读有关如何正确实施签名系统的信息。很容易弄错 - 即使专家经常弄错 - 所以要花时间了解你的建设和安全风险。