将用户名和密码存储在加密文件中而不是数据库中

Store Usernames and passwords in encrypted file instead of database

所以我知道你会说这很糟糕,但我真的不喜欢使用数据库,因为它同时令人困惑和困难。我还认为将用户名和密码存储在一个文件中是不好的,但用户名和密码都将使用 md5 加密。不过,我认为这不够安全,因为我要做到 public。如果你能给我一些改进的建议,请告诉我。

此外,您每分钟只能尝试两次;) 这是我的想法:https://drive.google.com/file/d/0B19YDO3uT0ClaVZsYjRFRVZkUzA/view?usp=sharing

此外,您能否举例说明如何以及在何处将文件存储在网络服务器中?老实说,我不太擅长php

大多数数据库都可以从开放网络访问,您还必须将数据库密码存储在 PHP 文件中。因此,在大多数配置中,使用数据库没有安全优势。这只是一个更舒适的table处理。

散列密码始终是一个好主意,应该被视为理所当然。 md5 不是安全算法。请考虑改用 password_hash()。当您的哈希文件被盗时,不要忘记散布盐字符串以防止彩虹 table 攻击。

任何双向加密都会使您的系统完全不安全,因为您必须在服务器上保存解密为纯文本的秘密,攻击者可以窃取他需要的一切。

限制登录尝试当然不是一个坏主意,但是,它并不像您想象的那么重要。主要弱点是获得对哈希文件的读取权限,然后处理离线暴力破解,最好使用 rainbow tables.

以下是我的建议。不要使用 md5,因为它不安全并且 too fast 不使用迭代。

您确实必须拥有 SSL 证书才能确保密码不被他人看到。任何没有证书的东西都大致相当于用户发送原始文本密码。您基本上只是更改了他们的密码。

正如 zaph 指出的那样,最好的做法是 pin the certificate

在客户端上

  • 将密码发送到网络服务器(由证书为您加密)

在网络服务器上

  • 存盐(a unique random string)
  • 使用 bcrypt 或其他安全 hashing algorithm 也采用盐
  • 来散列密码
  • 存储盐和散列加盐密码

您需要使用一种密码散列算法,该算法也需要加盐并进行迭代,以便散列需要大量时间,例如 100 毫秒。通常,您可以使用 PDKDF2bcryptscriptpassword_hash.

等算法

必须在服务器上对密码进行哈希处理。

使用 HTTPS 传输密码并在应用程序中固定服务器证书,固定很重要,因为它可以防止 MITM 攻击。

可能不需要数据库,这是查找时间和磁盘的问题I/O。您可以从一个固定罚款开始,然后迁移到需要性能的数据库 if/when。 "Uncle Bob" Martin 在 FitNesse 中延迟使用数据库,最后发现只需要一个平面文件解决方案。

注意:基本上所有简单的哈希方法,如SHA2、SHA3等,速度都很快,需要多次迭代,增加计算时间。时间很重要,因此攻击者无法快速尝试散列。每个密码需要一个随机(不完全唯一)盐,以消除使用预先计算的哈希彩虹表。