本期推荐的Berty 是一个开放、安全、离线优先、点对点和零信任消息传递的应用程序。
Berty特征
- 安全和私密:默认情况下,消息是端到端加密的元数据保持在最低限度创建帐户不需要电话号码或电子邮件地址即使在对抗网络上使用时也能保留其属性
- 审查弹性去中心化、分布式、点对点和无服务器借助 BLE 技术和mDNS,无需互联网连接。
- 打开:永久免费和开源
要求
一般 React Native 要求
- 自制或选择的包管理器
- 节点 >= 12.x
- The yarn管理器
iOS 开发要求
- Mac OS X
- XCode (最新稳定版)
安卓开发需求
- Android 应用程序开发环境,例如Android Studio
- Android SDK,启用以下功能(在 Android Studio 代码中Tools –> SDK Manager):SDK平台“Android 11.0 (R)”Android SDK 构建工具LLDBNDK 版本 23.1.7779620 ( export ANDROID_NDK_HOME=”$ANDROID_HOME/ndk/23.1.7779620″)制作Android SDK 命令行工具
Berty旨在用作日常消息传递应用程序。尽管如此,它的构建主要服务于以下用例:
- 当您需要通过不受信任的网络共享敏感信息时,例如在旅行时
- 如果您想匿名交流
- 如果您想完全控制您的数据,因此不想依赖第三方服务器
- 在积极监控和调整其网络的国家/地区,限制其使用并审查其某些内容
- 在连接较弱或根本没有连接的区域
Under the hood
Berty 协议带有一个通用但功能齐全的 SDK,允许开发人员编写对等应用程序。您可以只专注于您的应用程序的高级功能,我们将处理其余的(加密、身份、网络路由、组管理、帐户管理、设备管理、应用程序生命周期)。
Berty 协议的主要概念称为“组”,一个虚拟的地方,多个设备可以使用OrbitDB共享消息和元数据,它本身依赖于星际文件系统 ( IPFS )
得到它:
git clone https://github.com/berty/berty
反审查和反监视通信协议
Berty是一种匿名、安全的点对点协议,不需要互联网连接即可运行。
有一个使用高级密码学的协议和一个构建在该协议之上的信使应用程序。
- 创建帐户无需电话号码或电子邮件
- 用于加密所有对话的端到端加密
- 专注于泄漏尽可能少的元数据
- 去中心化、分布式、无服务器
- 没有共识,没有区块链
- 无需互联网连接(使用BLE 技术 和 mDNS)
- 永久免费,不存储数据,透明代码,开源
用途:
- 当您需要共享敏感信息时。
- 如果您想以良好的匿名性进行交流。
- 如果您不想使用服务器,因为您想完全控制您的数据。
- 在有审查和限制网络访问和使用的国家。
- 在连接或蜂窝接收信号较弱或无信号的区域。
- 当您旅行并希望通过不安全的公共连接进行安全通信时。
Go-IPFS-日志
ipfs-log 最初是为orbit-db – IPFS 上的分布式对等数据库创建的。该库旨在为 Go 中的 JavaScript 版本提供完全兼容的端口。
这段代码的大部分来自 JavaScript 的ipfs-log 库。
Gomobile-IPFS
这个 repo 旨在为 Android、iOS 和 React-Native 提供包,允许人们在移动设备上运行和使用 IPFS 节点。它也是一个讨论在移动设备上运行 IPFS 的限制以找到解决方案和交流技巧的地方。
路线图
- 基本 Java/Swift <-> go-ipfs 绑定
- InputStream 作为请求正文和请求响应IN PROGRESS
- 使用 Android/iOS 测试框架进行单元测试
- SetStreamHandler(protocolID, handler)和NewStream(peerID, protocolID)绑定
- 使用 CI 构建和发布的包
- Android/iOS 生命周期管理
- React -Native 模块进行中
- 改进这个自述文件
Berty 协议
本文档提供了 Berty 协议的技术描述。Berty 协议提供同一帐户拥有的设备之间的安全通信、一对一对话中的联系人之间的通信以及多成员组中的多个用户之间的通信。本文将解释这些点如何以分布式和异步方式实现,无论是否使用 IPFS 和直接传输(如 BLE)访问互联网。它还将描述 Berty 协议如何为所有交换的消息提供端到端加密和完美的前向保密。
影响
Berty 将 IPFS 用于即时消息传递的特定目的。对等网络用于即时消息有两个主要优点:
- 几乎不可能阻止或取消它:任何人都可以在几秒钟内在他们的计算机上启动一个节点,并且同一 LAN 中的两个节点仍然能够在没有互联网访问的情况下进行通信和操作,而在集中式模型中,它是更容易阻止对相关公司服务器的访问,甚至强制其关闭其服务器并停止其活动。
- 难以监控:没有可监视的中央服务器,也没有可破坏的中央目录,因此元数据收集大大减少。Berty 协议不是将公钥与电话号码等个人数据链接起来的目录,而是使用 TOTP 和公钥的组合来生成集合点地址并在 IPFS 上注册其用户,以后可以与希望通信的同行联系。
然而,它也带来了一些技术限制:
- 内容可用性:由于没有中央存储,所有消息都存储在用户设备上,并且无法访问存储在脱机或无法从给定网络访问的设备上的内容。
- 异步:没有中央服务器来统治时间线,因此时间戳不能用于除非关键任务(例如按特定顺序显示消息)之外的任何目的。例如:到期时间不能用于撤销对资源的访问,无法确定地确定一组对等点中操作发生的顺序等……
- 权限:没有中央权限来仲裁操作和任何由此产生的冲突或管理用户身份和权限。
集合点
集合点是对等网络上两个设备可以相遇的易失性地址。对等点可以在给定的集合点上注册他们的对等点 ID 和/或获取已注册对等点的列表。通过这种方式,例如,需要连接在一起以在对话中交换消息的对等方可以找到彼此。
对等点需要能够使用先前共享的秘密为给定的集合点自己生成相同的地址。
在 Berty 协议中,集合点的地址由两个值生成:
- 资源 ID
- 从 32 字节种子生成的基于时间的令牌
基于时间的令牌的生成遵循RFC 6238 的核心原则。
// golang
func rendezvousPoint(id, seed []byte, date time.Time) []byte {
buf := make([]byte, 32)
mac := hmac.New(sha256.New, seed)
binary.BigEndian.PutUint64(buf, uint64(date.Unix()))
mac.Write(buf)
sum := mac.Sum(nil)
rendezvousPoint := sha256.Sum256(append(id, sum...))
return rendezvousPoint[:]
}
Berty 协议中有两种类型的集合点:
- 公共集合点: 帐户使用此集合点接收联系请求。这里使用的资源 ID 是 Account ID,并且种子可以由用户随意更新,因此可以撤销向只有前一个种子的用户发送联系请求的能力。
- 组集合点: 此集合点用于在组内交换消息。这里使用的资源 ID 是 Group ID,种子不能更改。
—END—
开源协议:Apache-2.0, MIT