gpt4 book ai didi

javascript - pubnub,如何识别发件人?

转载 作者:行者123 更新时间:2023-12-02 20:23:22 25 4
gpt4 key购买 nike

从pubnub接收消息时,没有关于发件人的信息。如何知道它是来自visitorA还是visitorB的消息?网上有一些例子,发件人将他的名字与消息一起发送,但如何知道他没有欺骗别人的身份?

这是聊天界面的示例:

<html>
<body>
<form id="message_form">
<input id="message_input" type="text"/>
</form>
<div id="chat"></div>
<script src="http://cdn.pubnub.com/pubnub-3.7.1.min.js"></script>
<script>
var pubnub = PUBNUB.init({
publish_key: 'demo',
subscribe_key: 'demo'
});

pubnub.subscribe({
channel: 'chat',
message: function(message){
var div = document.createElement("div");
div.textContent = message;
var chat = document.getElementById("chat");
chat.appendChild(div);
}
});

var form = document.getElementById("message_form");
form.onsubmit = function(e) {
var input = document.getElementById("message_input");
pubnub.publish({
channel: 'chat',
message: input.value
});
input.value = '';
e.preventDefault();
};
</script>
</body>
</html>

最佳答案

聊天用户识别

您可以通过创建 唯一 ID 以及附加到聊天的聊天消息的 名称 识别发件人 。这类似于 IRC 策略,但更简单一些。

var user_id      = PUBNUB.uuid();
var user_name = name.value;
var user_message = input.vaule;

这是一个完整的示例,其中包括用于 UserName 输入的 HTML 元素。另请注意,我添加了一个 safe_text() 方法来防止 XSS 攻击。
<form id="message_form">
Name: <input id="name_input" value="John" type="text"/><br>
Message: <input id="message_input" value="Hi" type="text"/><br>
<input type="submit" value="send">
</form>
<div id="chat"></div>
<script src="http://cdn.pubnub.com/pubnub-dev.js"></script>
<script>
var userid = PUBNUB.uuid();
var pubnub = PUBNUB({
publish_key : 'demo',
subscribe_key : 'demo',
uuid : userid
});

function safe_text(text) {
return (''+text).replace( /[<>]/g, '' );
}
pubnub.subscribe({
channel: 'chat',
message: function(message){
var div = document.createElement("div");
div.textContent =
safe_text(message.name) + ": " +
safe_text(message.text);

var chat = document.getElementById("chat");
chat.appendChild(div);
}
});

var form = document.getElementById("message_form");
form.onsubmit = function(e) {
var input = document.getElementById("message_input");
var name = document.getElementById("name_input");

pubnub.publish({
channel: 'chat',
message: { name : name.value, text : input.value, userid :userid }
});
input.value = '';
e.preventDefault();
};
</script>

虽然此演示为您提供了一个快速且简单的入门应用程序,但您将需要添加更多 enhanced chat security and chat authentication systems

User Identification for Chat Apps

有关构建聊天应用程序的其他资源,请查看 Build Real-time Chat Apps in 10 Lines of Code 指南和 Building A Basic Chat Application

聊天访问控制层 ACL

您需要添加 Security ACL Access Control Layer 。使用 PubNub 访问管理器 (PAM),您可以通过授予用户访问 token 权限来控制谁可以访问。

PubNub Chat Access Management ACL Access Control Layer
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
// Grant Chat Access to Secured Conversations
// All server-side data is stored according to defined security policies.
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
var pubnub = PUBNUB({
publish_key: "PUBLISH_KEY",
subscribe_key: "SUBSCRIBE_KEY",
secret_key: "SECRET_KEY"
})
pubnub.grant({
channel : "CHANNEL",
callback : receiver,
error : receiver,
ttl : 60, // Minutes
read : true,
write : true,
auth_key : "AUTH_KEY"
});

建议在可信系统(例如您自己的数据中心服务器)上运行此级别的 ACL 代码。

发送/接收安全加密消息

PubNub 客户端库提供内置的高级加密标准 (AES) 256 位加密。要使用消息加密,只需在初始化时使用 cipher_key。

使用 TLS 和 ssl 标志启用传输层加密。

然后像往常一样发布/订阅。
var pubnub = PUBNUB({
subscribe_key: 'sub-c-f762fb78-...',
publish_key: 'pub-c-156a6d5f-...',
ssl: true,
cipher_key: 'my_cipherkey'
});

发件人身份的消息验证

将用户信息附加到每条消息是有效的,并在您的应用程序中提供了非常强大的灵活性。然而,恶意用户可能会试图欺骗用户的身份并因此冒充其他用户。在示例应用程序中,我们已经展示了通过在 "message_form" 字段中更改您的姓名来模拟任何人是很容易的。这与您在使用电子邮件和 SMTP 时遇到的情况相同,除非您提供了一种验证发件人身份的方法,否则可能会出现任意电子邮件 header 模拟。有一个解决方案! 😄

数字签名是带有消息有效载荷关键组件的嵌入式安全加密散列的指纹,可选地包括盐(有时是时间戳),然后使用用于验证发送者身份的非对称 key 进行签名/加密。此过程用于阻止欺骗者和冒充者。

Chat Message Verification with Cryptographic Digital Signature

A digital signature is a mathematical scheme for demonstrating the authenticity of a digital message or document.



聊天应用程序的消息验证

首先假设只有聊天用户被授予访问权限,并且他们可以使用 PubNub 访问管理器实现中可用的 grantrevoke 技术发布和订阅聊天 channel 。
这里的挑战是,在群聊室中,您的聊天用户已被授予 auth_tokens,但他们仍然可以冒充 channel 上的其他聊天用户。

这里的目标是在客户端收到消息时验证两件事。
  • 发件人的身份。
  • 消息的完整性。

  • 使用非对称加密,您可以通过创建 数字签名 为用户的消息提供一层验证和安全性。有效的数字签名使收件人有理由相信该消息是由已知发件人创建的,发件人不能否认已发送该消息(身份验证和不可否认性),并且该消息在传输过程中没有被更改(完整性)。数字签名通常用于金融交易和面向消息的通信,例如电子邮件和 聊天 ,以及在检测伪造或篡改很重要的其他情况下。

    您将首先向您的每个聊天用户发出一组 key , 服务器生成的 ,在用户登录后通过您的服务器使用公钥(非对称)算法,例如 ECC/RSA。我推荐 ECC,因为 key 大小比 RSA 小得多,但具有可比的加密强度。聊天室中的每个聊天用户都通过安全的只读侧信道收到其他聊天用户的公钥通知。您的用户只能从由您的服务器的受信任和安全环境控制的公共(public)只读 channel 接收 公钥 。您的服务器将能够将每个用户的公钥写入此只读 channel 。您的用户将从此 channel 阅读。

    在加入聊天室之前,您的用户可以通过 PubNub History 调用接收彼此的公钥。他们还应该打开对同一 channel 的订阅,以获取加入聊天室的新聊天用户的公钥。

    除了经过验证的所有者之外,用户的私钥不得暴露给任何人。这可以在电子邮件/密码登录时完成,您可以在已验证用户登录后立即将私钥发送给他们。

    发送带有附加数字签名的聊天消息
    { userId: 123456,
    profilePic: "http://www.chats.com/user1234.jpg",
    message: "Hello World",
    signature: "tnnArxj06cWHq44gCs1OSKk/jLY" }

    您将通过连接以下基本字符串 (userId+profilePic+message) 来创建签名。接下来,您需要使用 SHA1(signature_base_string)SHA256(signature_base_string) 计算消息摘要。现在,您可以使用此加密生成的哈希值,通过 ECC/RSA 非对称算法使用用户的私钥进行签名。

    现在将此数字签名附加到聊天消息,如上例所示,并附加到 聊天室消息验证 的最后阶段。

    聊天室消息验证

    订阅聊天室 channel 后,您将收到用户发送的带有附加数字签名的聊天消息。您将使用此签名来验证聊天消息的真实性。如果该消息是企图欺骗,您将完全删除该消息。
    // Digitally Signed Chat Message
    { userId: 123456,
    profilePic: "http://www.chats.com/user1234.jpg",
    message: "Hello World",
    signature: "tnnArxj06cWHq44gCs1OSKk/jLY" }

    要验证签名,您将通过连接以下基本字符串 (userId+profilePic+message) 来创建签名。接下来,您需要使用 SHA1(signature_base_string)SHA256(signature_base_string) 计算消息摘要。现在使用您已经拥有的 userId 123456 的聊天用户公钥,您可以验证/解密数字签名以获取您刚刚生成的原始消息摘要,该摘要也是由发件人创建的。

    比较当前消息摘要和原始消息摘要。如果它们相同,则消息是真实的,并且您已通过数字签名使用消息验证成功验证了发件人的消息。如果摘要不匹配,则是虚假消息,您可以忽略冒充者。

    使用 PubNub 创建 PKI 公钥基础结构

    您需要一种方法来通过只读 PKI 安全地传输公钥 。 PubNub 为您提供了一种向您的聊天用户公开 安全只读 PKI 列表的方法。需要注意的是,PKI 需要非对称 key 算法,如 ECC 或 RSA。此外,我们正在使用这些加密算法来创建数字签名,而不是加密数据。这意味着我们将能够通过使用公钥成功解密签名并验证加盐签名字符串匹配来识别和验证发件人。
  • 公钥 用作 解密 key 验证 key
  • 私钥 用作 加密 key 签名 key 45.67920

  • 需要注意的是,您应该只打印从公钥可信源检索到的用户名,而不是从消息内容中检索到的用户名。消息内容仅用于签名和验证身份。如果身份被更改,则必须使用 PubNub 的广播机制和存储和回放通过 PKI 进行中继以进行安全授权。

    Access tokens, Identity Name/Photo and Asymmetric Keys must only be generated from trusted execution environments on your servers and relayed over PubNub's Authorized Read-only PKI data channels.

    关于javascript - pubnub,如何识别发件人?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30739973/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com