【问题标题】:Can I use password_hash() to validate the sender?我可以使用 password_hash() 来验证发件人吗?
【发布时间】:2015-07-12 04:07:39
【问题描述】:

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

我的疑问是我需要如何散列公钥。如果我需要使用简单的哈希算法(如hash(sha256))或者我可以使用password_hash()

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

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

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

接收方将检查command:key 是否有效,在服务器端重新生成公钥,重复发送方完成的相同过程,使用相同的私钥。如果它通过了,它也会检查此密钥是否以前使用过,以及时间戳是否最接近当前时间(以避免使用较旧的有效密钥)。如果都有效,则服务器执行action:name并向发送者返回响应。

示例

Bob(客户端)想要在 Alpha(服务器)上执行 truncate-users 函数。 Bob 知道服务器私钥。所以他创建了一个公钥(令牌)来验证你在服务器上的命令。

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

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

【问题讨论】:

  • 你永远不应该散列一个公钥。在第二次阅读时,我不确定您是否尝试发明自己的Public-key cryptograph 版本。如果您确定查看现有的完善和工作版本
  • 基本上,我试图让我的服务器识别收到的消息是否可信。所以我有一个私钥(只有客户端和服务器知道),所以客户端和服务器可以检查生成的公钥。我认为这个 wiki 基本上就是我想要做的,真的。 -- 也许吧,只是我不想解密,只检查是否可信。
  • 这是新的,你更好地了解公钥-私钥的实现而不是构建自己的
  • 检查我的例子。我不想重新实现一个安全协议,比如 HTTPS,但是例如验证用户。基本上,公钥是客户端在服务器上执行命令的“密码”。

标签: php


【解决方案1】:

听起来您真正想要的是如何为请求计算 数字签名。签名用于验证请求是否来自正确的发送者,并且消息没有被篡改。

看起来 PHP 通过 openSSL 支持签名

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

【讨论】:

  • 确保在请求中包含时间戳以防止重放攻击。签名只能解决我可以信任这个请求问题的一部分。您仍然需要验证数据,并假设攻击者可以读取和重放网络中的内容。
【解决方案2】:

如果我理解您的操作正确,那么是的,您可以使用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。一般来说,这些都是更好的主意,因为如果你自己尝试,更容易把事情搞砸。

【讨论】:

    猜你喜欢
    • 2018-11-22
    • 2020-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-25
    • 2014-07-12
    • 1970-01-01
    • 2011-10-17
    相关资源
    最近更新 更多