【问题标题】:Public Key Authentication公钥认证
【发布时间】:2021-01-06 00:40:55
【问题描述】:

我一直在设计一种基于区块链的加密货币,区块链上的一些区块可以由区块的所有者更新其数据。我尝试实现一种 ssh 样式的公钥身份验证:客户端生成一个密钥对并将公钥发送到块,在该块中它允许“管理员”下列出的公钥更改块的元数据。这样做的问题是有人可以发送随机的已知公钥以查看他们是否被允许编辑元数据,ssh 如何防止人们仅发送带有已知公钥的某种字符串来访问 ssh 的内容? (我问这个是因为我想实现类似于我的上下文的东西)

【问题讨论】:

  • “这个问题是有人可以随机发送已知的公钥来查看他们是否被允许编辑元数据” 你为什么这么认为?区块链的核心属性之一是它在被链上更高的块签名后是不可更改的。这意味着“管理员”部分中的公钥无法更改。因此,如果您想将消息添加到稍后引用“您的”块的块,您必须使用与存储在“您的”块中的公钥对应的私钥对消息进行签名。您可以有一个消息类型来添加也签名的公钥
  • 我做的架构安全性很差。当私有实体拥有的块更新时,它将查询一个公钥(存储在块中的一个字段中),并随之追加、删除或更改存储在块中的特定密钥和/或字段。因此,如果您知道允许更改数据的公钥(容易发生在分布式账本上),您可以更改不属于您的块并在链的下游对其进行更新。我确信我可能已经想到了一种更安全的方法,当它奏效时我会分享我的发现。感谢您的回复。

标签: ssh cryptography blockchain public-key-encryption public-key


【解决方案1】:

不确定这是否真的是一个编程问题,但是:

SSH 始终使用公钥密钥来验证“主机”(服务器)和可选(但经常)验证“用户”(客户端)。对于后一种情况,常用且事实上的标准实现 OpenSSH 为服务器上的每个用户使用一个文件,该文件通常位于用户的主目录下,名称为 $HOME/.ssh/authorized_keys,其中列出了对该用户有效的公钥。如果客户端进程指定该用户的authorized_keys文件中列出的用户名和公钥,并使用私钥对包括连接秘密和随机数在内的某些数据进行签名,则认为可以证明用户的身份。 (有关详细信息,请参阅 RFC 4252,但从 4253 开始了解上下文。)其他实现需要具有等效数据,尽管不一定是确切的文件。主机/服务器通常允许用户/客户端进行多次尝试,以防它有多个密钥和/或其他方法可以尝试,但这是可配置的。

SSH 本身大多不控制访问;它只是将用户/客户端的身份建立为在“主机”上配置的用户名。使用该身份来控制访问——人们称之为授权而不是识别和身份验证的安全性——取决于主机。 许多 SSH 主机是 Unix,对于 Unix 相同的规则适用于通过 SSH 访问 Unix 和适用于其他类型的连接:这从经典的“chmod bits”开始每个文件都允许对用户、组、其他进行读、写、执行,并且可以包含其他内容,例如 ACL、SELinux 属性、sudo 规则、信令进程的组匹配、NFS 等某些东西的特殊配置等等。如果 SSH 主机/服务器不是 Unix,那么在您连接和验证后它应用什么安全规则或策略取决于它,并且可能完全不同。

OpenSSH(在 Unix 主机上)还在 authorized_keys 文件中实现了一些选项,这些选项对客户端(通过该连接)可以做什么施加附加限制;在您的系统上查看 man sshd or here under AUTHORIZED_KEYS FILE FORMAT。此外,如那里所述,OpenSSH 支持一定程度的间接:您可以使用(指定的)“CA”密钥来签署其他密钥,然后配置 authorized_keys 以接受任何密钥,而不是直接列出每个适用用户的 authorized_keys 文件中的每个密钥由列出的 CA 密钥签名。这些证书本身可以包含一些限制;见man ssh-keygen under CERTIFICATES。这在有许多用户、主机或两者兼有的大型环境中会更方便。

【讨论】:

  • 非常有见地和乐于助人。谢谢您的答复。当我在安全方面取得成功时,我会将这些知识与应用程序相结合并更新此线程。
猜你喜欢
  • 2013-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-05
相关资源
最近更新 更多