安全的 Pubnub 订阅者密钥和频道名称

Posted

技术标签:

【中文标题】安全的 Pubnub 订阅者密钥和频道名称【英文标题】:Secure Pubnub subscriber key and channel name 【发布时间】:2015-02-12 08:34:18 【问题描述】:

我有一个应用程序,每个用户都必须收到仅与他们自己相关的通知。

为此,我为每个用户创建了一个唯一的频道名称。当用户使用javascript从浏览器登录时,我订阅了这个频道。

pubnub = PUBNUB.init(
   subscribe_key : '<subscriber-key>'
);

pubnub.subscribe(
  channel: "<unique-channel-name>",
)

我的问题是,如果有人获得了用户唯一频道的名称,他们可以设置自己的 pubnub 客户端并在没有任何授权的情况下接收通知吗?基本上,保护我的用户数据的只是在页面源代码中公开的频道名称和订阅者密钥。我查看了 pubnub 的访问管理器,但它也遇到了同样的问题,不是吗?如果有人打开源代码并复制 auth-key,他们可以设置自己的客户端并接收消息吗?

编辑:附加信息

我会在每个用户注册时为他们生成并保存一个频道名称。此名称是一个随机 UUID,例如“7304cd62-9ba2-4842-98d8-8a5c8e561275”。当我想通知用户,比方说,他们收到了好友请求,我从数据库中提取频道名称并发布通知。每当他们登录时,呈现的页面都会使用 Ruby 将他们的频道名称和我的订阅者密钥注入到隐藏字段中,javascript 使用该隐藏字段来初始化 pubnub。

<%= my_pubnub_subscriber_key %>
<%= current_user.channel.name %>

在这种情况下,使用 Access Manager 意味着除了频道名称之外,我还必须存储一个身份验证密钥,并授权该密钥读取频道。

John
- john-channel
- john-key-authorizing-read-on-john-channel

Jane
- jane-channel
- jane-key-authorizing-read-on-jane-channel

然后渲染的页面将具有三个字段来初始化 pubnub:

<%= my_pubnub_subscriber_key %>
<%= john-channel %>
<%= john-key %>

原来的问题仍然存在。如果 Jane 去 John 家,打开 John 主页的源代码,复制 3 个密钥,回到家创建自己的客户端,她可以订阅 John 的通知。我不知道我的通知接收者是实际登录还是只是复制了密钥。

我的想法是否正确,为了防止这种可能性,我应该简单地定期重新生成频道名称或身份验证密钥,例如当用户注销时或每天?

【问题讨论】:

嗨,好奇的观察者!我有一个快速提示:您必须像对待会话 ID 一样对待您的 auth_key(这就是 Facebook、Gmail 和 Twitter 的工作方式)。我会在下面写一些更多的细节。 首先确保发出 REST 调用,而不是将密钥添加到页面的源代码中。这更安全,让您在安全方面更加灵活。 【参考方案1】:

使用 ACL/访问管理保护 PubNub 上的数据流

? 使用 PubNub 访问管理器查看最新文档 - https://www.pubnub.com/docs/security/access-control

您还想保护 PubNub 订阅者密钥和频道名称。 通过每个连接级别的细粒度读写访问控制,您 可以为用户、设备和渠道提供授权和访问控制。

好的部分 - 使用 PubNub 访问管理和 ACL,您可以 防止某人设置自己的 PubNub 客户端 并在未经任何授权的情况下接收通知。

这是通过 PubNub auth_key 完成的,这是一个经过身份验证的访问令牌 由您的服务器管理。本质上你想要 Mitigate and Prevent Subscription Sharing 为您在 PubNub 数据流上的宝贵数据。

保密和安全 - 实时数据流的访问控制

您必须像对待秘密一样对待您的 PubNub auth_key 仅供用户使用。 这就像一个允许访问数据流的会话密钥/ID, 类似于 Netflix、Spotify、Facebook 和 Gmail 提供安全的访问层。

这就是您的 JavaScript 应具有的安全访问控制外观。

Wohhhh 注意 - JavaScript 文件中没有存储访问密钥。

// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
// Get User Access Keys from Your Server
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
console.log('getting user login information');
get_user_access( 'https://myservers.com/user/login/', function(user) 
    var pubnub = PUBNUB(
        subscribe_key : user.subscribe_key,
        auth_key      : user.auth_key
    );

    ready( pubnub, user );
 );

// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
// Data Stream Connection Ready to Start
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
function ready( pubnub, user ) 
    console.log('ready to subscribe to data stream channel');

    pubnub.subscribe(
        channel : user.channels,
        message : receiver
    );


// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
// Data Stream Payloads Received
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
function receiver(data) 
    console.log('received secure data payload');

撤销对恶意活动的访问权限

如果用户登录两次或打开多个 PubNub 怎么办 数据流连接? 如果您检测到滥用行为,您可以立即撤消访问权限 pubnub.revoke() 命令。

// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
// Revoke Access from Your Server
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
pubnub.revoke(
    channel   : 'CHANNEL_NAME',
    auth_key  : 'BAD_APPLE_AUTH_KEY',
    callback  : function(m)console.log(m) 
);

安全的 PubNub 订阅者密钥和频道名称 使用 ACL/访问管理保护 PubNub 上的数据流

此外,如果您使用 Node.JS 进行访问管理控制,我们会为您提供一个有趣的社区论坛帖子,其中描述了使用 PubNub Access Manager with Node.JS 以合理的速度进行的大规模赠款,既好又好。

【讨论】:

感谢您的快速回复。我明白你想说什么,它帮助我更好地理解了 pubnub。我已经编辑了我的问题以提供更详细的上下文。 这与 Facebook 的问题相同。我可以打开您的 FB 页面并从网络选项卡中复制您的 auth_key 并访问您的 Facebook 页面。但是,如果您想从 PubNub 的角度添加额外的预防措施以防止这种情况发生,您可以遵循:Mitigate and Prevent Subscription Sharing for SaaS Companies 我明白了。现在,我将使用 REST 调用和通道名称/身份验证密钥重新生成。很高兴知道更复杂的安全性是可能的。谢谢。 使用 PubNub 访问管理器查看最新文档 - pubnub.com/docs/security/access-control

以上是关于安全的 Pubnub 订阅者密钥和频道名称的主要内容,如果未能解决你的问题,请参考以下文章

获取 Pubnub 中某个频道的订阅者数量

c_cpp ESPn66的Pubnub Arduino SDK代码示例。演示发布和订阅。从PubNub Developer Portal获取您唯一的PubNub密钥

在flutter中使用pubnub,如何发起聊天?

订阅私人频道时的 Pusher/Laravel 回显错误:订阅频道的身份验证值无效:格式应为“密钥:签名”

来自具有PubNub,可伸缩性和超过9000个聊天室的后端的实时用户通知

PubNub 最佳实践:如何管理私人房间?