gpt4 book ai didi

nearprotocol - 如何使用NEAR的帐户系统加密邮件

转载 作者:行者123 更新时间:2023-12-03 14:14:33 29 4
gpt4 key购买 nike

NEAR的帐户可以有许多不同的 key 对来访问同一帐户。键也可以更改和旋转。这意味着使用特定用户的公用 key 加密消息的默认方法不起作用。

为特定用户加密消息的最佳方式是什么?

最佳答案

NEAR帐户 key 不适用于此用例。

通常,与具有多个设备的每个参与者进行端到端的加密消息(在最特定的意义上是端到端的加密聊天,但通常是交换加密消息的任何应用程序)并非易事。例如。出于某种原因,在Telegram中,私有(private)聊天被附加到一个设备上,而在其他设备上不可用。

原因是通常这需要在设备之间共享私钥,而安全地进行私钥本身就是一个挑战。

这是有关如何与进行端到端加密聊天的逐字提议

a)每个参与者可能会从多个设备参与
b)消息不仅直接与某人共享,而且还与参与者“组”共享。

设计目标是,发送消息应为固定时间(不取决于目标用户使用的设备数/发送给该组的人数),而某些操作可以是线性的。

作为NEAR的一个库,有一个计划要添加,但是关于它的工作尚未开始,并且尚未计划开始。

提议

问题陈述:
我们希望在群组聊天中添加新成员,并删除旧成员;
新成员能够在加入之前看到发布的消息是愿望列表功能;
旧成员离开后应该看不到新消息;
用户应该能够使用多个设备,并在所有设备的所有群聊中查看所有消息;
每个消息必须存储一次(每个组参与者不能存储一次);

提议的解决方案:

  • 系统中有三种 key 对:帐户 key (不要与NEAR帐户 key 混淆),设备 key 和消息 key 。
  • 每个帐户只有一个帐户 key 。它是在帐户首次使用该服务时生成的。

    account_keys:PersistentMap
  • 每个设备在第一次从设备访问聊天时(或每次擦除本地存储时)都有自己的设备 key 。

    DeviceKey类{
    名称:字串,
    device_public_key:公钥,
    encryption_account_secret_key:EncryptedSecretKey ?,
    }

    device_keys [account]:PersistentVector

    永久向量是每个帐户的,每个此类永久向量包含设备公钥(设备私钥仅存在于设备上)以及使用此公钥加密的帐户 secret key ;如果未使用此公钥加密该 secret key ,则为null公钥呢。

    有三种方法可以管理设备 key :
  •     addDeviceKey(device_public_key: PublicKey, name: string): void

    添加新 key ,并将null与相应的加密帐户 secret key 相关联。
        removeDeviceKey(device_public_key: PublicKey): void

    拔出设备 key
    authorizeDeviceKey(device_public_key: PublicKey, encrypted_account_secret_key: EncryptedSecretKey): void

    设置设备 key 的加密帐户 key 。

    因此,用户的流程将是:

    a)从新设备启动聊天,并为其命名。
    b)从已经具有加密帐户 key 的其他设备打开聊天,转到“设备”设置并授权新设备。
  • 所有消息 key 都存储在一个大型的持久向量中:
  •     all_message_public_keys: PersistentVector<PublicKey>

    并且在所有其他地方,都使用u32索引将其引用到向量中。
    每个用户都知道一些消息 secret key :
    encrypted_message_secret_keys[account]: PersistentMap<u32, EncryptedSecretKey>
    encrypted_mesasge_secret_keys_indexes[account]: PersistentVector<u32>

    map 和向量是每个帐户的。仅需要该向量,以便当用户更改其帐户 key 时,我们知道我们需要重新加密的所有消息 key 。
    key 使用帐户 key 加密。

    每个 channel 在每个时刻都只有一个与之关联的消息 key ,尽管这些 key 可能会在该 channel 的整个生命周期中发生变化。
    channel_public_keys: PersistentMap<u32, u32>

    其中键是 channel ID,值是消息键ID。
  • 每个消息都有一个u32字段,该字段指示使用了哪个消息 key 对其进行加密。如果未加密,则值为u32::max。每当将消息发送到 channel 时,都会使用当前 channel 的消息 key 对其进行加密。
  • 然后,流程如下:

    当使用初始参与者集创建 channel 时,该 channel 的创建者将创建消息 key 对,并使用每个参与者的帐户 key 对 secret key 进行加密,并调用
  •     createChannel(channel_name: string,
    accounts: AccountId[],
    message_public_key: PublicKey,
    encrypted_message_secret_keys: EncryptedSecretKey[])

    注册消息 key ,将加密的 secret key 添加到相应的集合中,然后创建 channel 。

    如果需要添加新用户,则 addUserToChannel(account: AccountId, encrypted_message_secret_key)将该用户添加到 channel 用户列表中,并授予其访问最新消息访问 key 的权限。

    如果需要删除用户,则 deleteUserFromChallen(account: AccountId)会删除该用户。在这种情况下,或者如果其他 channel 参加者认为其消息 key 已被盗用,他们会致电给
    updateChannelMessageKey(message_public_key: PublicKey, 
    encrypted_message_secret_keys: EncryptedSecretKey[])

    请注意,由于每条消息都具有关联的 key ,并且 channel 参与者没有失去对旧消息 key 的访问权限,因此现有 channel 参与者可以读取所有历史记录,而无需重新加密。但是,自从上次更新 key 以来,加入该 channel 的新用户将仅看到消息。
  • 当用户需要更新帐户 key 时,他们需要:
    a)用所有设备 key 对其进行加密;
    b)用新的帐户 key 加密其所有消息 key ;
    c)将(a)和(b)供应到契约(Contract)方法中,以更新相应的馆藏。

    经过这样的过程,用户将可以使用新的帐户 key 访问所有设备上的所有旧消息。
  • 关于nearprotocol - 如何使用NEAR的帐户系统加密邮件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62291352/

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