匿名系统.

后端建两个表,一个用户,一个留言,每一则留言都对应一个用户和一个属性-是否公开留言用户。在前端所有留言都显示为匿名,只有留言用户有选项可以公开/隐藏自己留言的用户名。如果一个留言用户公开,这个留言对所有人的显示就从匿名变成留言的用户。所有计算都可以在后端完成,对任意一个用户B给前端的数据可以是:

留言1,匿名 留言2,用户A 留言3,用户B,公开/隐藏我的留言


Subject: RE: 怎样设计这样一个匿名的留言系统?

要求:

  1. 群里的任何一个人(假设是A),在留言之后都可以证明这个留言是他留的
  2. 群里A之外的任何另一个人(假设是B),都无法证明某一留言是或者不是出自A
  3. 如果A有两个留言,B无法证明这两条留言是出自同一个人的

根据1:可以在系统后台保留留言的人的留言人信息(ID以及留言提交时的timestamp),并且只在当前登录用户ID与留言ID匹配的时候才显示留言的留言人信息,对其他用户只显示留言并且不下载不显示留言人信息。 根据2&3:因为系统不对非留言作者显示留言人的ID和留言时的timestamp,所以可以达到这两个要求。


Subject: RE: 怎样设计这样一个匿名的留言系统?

每个用户给个ID不给用户看到,但是每个留言的用来显示的用户名和留言一样每次留言的时候让用户自己输入这次留言我想叫什么名字。显示留言的时候要不不显示用户名,要不就显示每次自定义的用户名,别人不就不知道了吗?然后用户去自己留言记录页面的时候用ID给他所有留过的言?我是不是把问题想太简单了


Subject: RE: 怎样设计这样一个匿名的留言系统?

只是个大概的想法:用Bitcoin里的Hierarchical Deterministic Wallet

唯一的alias当作seed,用HD Wallet衍生出大量的子密钥对(公钥&私钥) 每个出自A的留言MesX,用一个新的私钥KeyX签名,签名可以被公钥PubX验证 留言里可以附上密钥衍生的Path

只有A可以证明PubX属于自己的私钥KeyX,因为所有的KeyX都是由他的seed衍生的 间接证明了留言MesX是A发出来的 因为每个留言用的私钥都不一样,没有人可以证明两个消息出自同一个人,除了作者自己

https://www.arcblock.io/zh/post/2018/12/01/hd-wallets-design-and-implementation

这个想法和Thread里有位大哥提出来的签名的时候跟一个GUID再Hash类似


Subject: RE: 怎样设计这样一个匿名的留言系统?

这样的话,公布key的人需要证明自己的alias和解密出来的alias一致,不然这个人就可以放一个假的alias来“诬陷”别人。然后问题就又绕回来了。感觉还是得用RSA吧。


Subject: RE: 怎样设计这样一个匿名的留言系统?

这个需求用对称加密就可以实现了。

  1. 留言之后用key加密自己的alias作为签名,证明只需要用key decrypt签名就好了
  2. 其他人没有key,只能看到加密的签名
  3. 签名时,加密内容用alias + random就可以了

Subject: 怎样设计这样一个匿名的留言系统?

假设只有某个群里的人才可以在这个系统里面留言,留言次数没有限定,留言内容没有限定;群里的每个人都有一个唯一的ID(e.g. alias for MSFT employee)。

要求如下: • 群里的任何一个人(假设是A),在留言之后都可以证明这个留言是他留的 • 群里A之外的任何另一个人(假设是B),都无法证明某一留言是或者不是出自A • 如果A有两个留言,B无法证明这两条留言是出自同一个人的