这个无密码系统安全吗?

信息安全 验证 密码学 哈希 数据库 登记
2021-08-12 06:36:49

一个人有一个要求输入姓名和密码的表格。密码被发送到通过散列名称和密码创建散列的服务器。使用 ascii 值将此哈希转换为数字。该数字限制为 10 位,用于生成随机数生成器。从 1-77616 生成三个随机数。这些数字用于从 77616 个英文单词列表中选择单词。形成的三个词用作个人用户名。

77616^3 大约是 2^48,因此在一百万代用户名后发生冲突的概率应该是 ~0.001774778278169853。

这似乎是一种管理用户的安全方式,因此不必实施登录/注册系统?与传统的登录/注册系统相比,使用这种系统有什么好处吗?

4个回答

不,这似乎不安全。

碰撞

Mersenne Twister 是一种确定性 RNG,因此它不适合大多数加密任务(尽管它的使用是有意义的,因为如果它不是确定性的,那么您的方法当然行不通)。

在这种情况下,碰撞不会发生在您假设并基于您的计算的阶段。相反,当您将 ascii 值限制为 10 位时,它们会发生,因此发生冲突的概率比您假设的要高得多。

对方法的评论

你所拥有的基本上是一个自制的散列函数。您接受一些输入,对其应用一些功能,并接收固定长度(3 个字)的输出。输入空间大于输出空间,无法逆过程(从存储的三个字中获取密码)。

不要自己动手,也不要成为戴夫申请。要正确散列密码,请参阅如何安全地散列密码?.

您仍在实现登录和注册系统(用户需要输入用户名和密码,您以某种形式存储它,然后可以将存储的值与新输入的值进行比较以验证用户)。

如果您在这一步停止:“密码被发送到创建哈希的服务器”,您将有一个普通的过程。但相反,您添加了额外的步骤,这些步骤不会增加而是降低安全性。

您从用户名 + 密码哈希开始,后者希望是至少 256 位的加密哈希。然后你把它变成一个 10 位数字,扔掉除了 33 位之外的所有位。然后,您将其用作伪随机数生成器的种子,以计算 48 位的单词密钥,但信息已经丢失——您不能将 33 位拉伸为 48 位,(最多)只有 10 个^10 三个词的可能选择。所以你的方法,即使实现得很好,也会放弃很多熵而没有任何好处。您还可以要求用户有 7 个字母的密码,不带大写字母或符号。

除了数学之外,由于用户假设,您的系统是不安全的。普通用户一般不会将其用户名视为机密。大多数系统不会对其他用户隐藏它(例如,在这个站点上,我们都可以看到彼此的用户名)。您的用户不会不共享它,并且不会理解您正在通过此用户名登录他们(他们会天真地假设有 cookie 或证书或正在自动登录的东西)。

不,您没有消除密码。您已删除用户名,然后将密码重命名为“用户名”。由于您将其称为“用户名”,因此您的用户会假设“这是我的用户名,我可以与我的朋友在线分享”,然后他们的帐户就会被黑客入侵。

不要让安全依赖于“用户名”的保密性。