Public 密钥验证

Public Key Authentication

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

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

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

SSH 本身大多无法控制 访问;它只是将 user/client 的身份确定为在 'host' 上配置的用户名。使用该身份来控制访问——安全人员称之为授权而不是识别和验证——取决于主机。 许多 SSH 主机是 Unix,对于 Unix 相同的规则适用于通过 SSH 访问 Unix 与适用于其他类型的连接:这从每个文件上的经典 'chmod bits' 允许对用户、组、其他进行读、写、执行,并且可以包含其他内容,例如 ACL、SELinux 属性、sudo 规则、信号处理的组匹配、NFS 等某些内容的特殊配置,等等等等。如果 SSH host/server 不是 Unix,那么在您连接并验证它后它应用什么安全规则或策略取决于它,并且可能会有很大不同。

OpenSSH(在 Unix 主机上)还在 authorized_keys 文件中实施了一些选项,这些选项对客户端(通过该连接)可以做什么施加了 额外的 限制;在您的系统上查看 man sshd or here under AUTHORIZED_KEYS FILE FORMAT. In addition, as noted there, OpenSSH supports a level of indirection: instead of directly listing every key in each applicable user's authorized_keys file you can use a (designated) 'CA' key to sign other keys, and then configure authorized_keys to accept any key signed by a listed CA key. These certificates can themselves include some restrictions; see man ssh-keygen under CERTIFICATES。这在具有许多用户、主机或两者的大型环境中会更方便。