将用户名和密码存储在加密文件中而不是数据库中
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 毫秒。通常,您可以使用 PDKDF2
、bcrypt
、script
或 password_hash
.
等算法
必须在服务器上对密码进行哈希处理。
使用 HTTPS 传输密码并在应用程序中固定服务器证书,固定很重要,因为它可以防止 MITM 攻击。
可能不需要数据库,这是查找时间和磁盘的问题I/O。您可以从一个固定罚款开始,然后迁移到需要性能的数据库 if/when。 "Uncle Bob" Martin 在 FitNesse 中延迟使用数据库,最后发现只需要一个平面文件解决方案。
注意:基本上所有简单的哈希方法,如SHA2、SHA3等,速度都很快,需要多次迭代,增加计算时间。时间很重要,因此攻击者无法快速尝试散列。每个密码需要一个随机(不完全唯一)盐,以消除使用预先计算的哈希彩虹表。
所以我知道你会说这很糟糕,但我真的不喜欢使用数据库,因为它同时令人困惑和困难。我还认为将用户名和密码存储在一个文件中是不好的,但用户名和密码都将使用 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 毫秒。通常,您可以使用 PDKDF2
、bcrypt
、script
或 password_hash
.
必须在服务器上对密码进行哈希处理。
使用 HTTPS 传输密码并在应用程序中固定服务器证书,固定很重要,因为它可以防止 MITM 攻击。
可能不需要数据库,这是查找时间和磁盘的问题I/O。您可以从一个固定罚款开始,然后迁移到需要性能的数据库 if/when。 "Uncle Bob" Martin 在 FitNesse 中延迟使用数据库,最后发现只需要一个平面文件解决方案。
注意:基本上所有简单的哈希方法,如SHA2、SHA3等,速度都很快,需要多次迭代,增加计算时间。时间很重要,因此攻击者无法快速尝试散列。每个密码需要一个随机(不完全唯一)盐,以消除使用预先计算的哈希彩虹表。