use*_*509 0 c++ security logic c++11
我试图了解安全身份验证.这是我能想到的最安全的方法.
将加密的用户名+ SHA-256ed密码发送到服务器并等待是/否响应.但问题是黑客可能会将响应视为"是",而应该是"否",从而授权他们对该帐户进行未经授权的访问.
我想你可以通过加密响应来解决它,然后,而不是将其存储在一个Boolean,调用一个改变应用程序状态的函数.但是因为黑客可以让服务器说不,而且他的控制是,他可以找到加密密钥并仍然改变结果.
这似乎有点不安全,对吧?什么阻止黑客隔离登录你的功能或者Boolean?
或者我只是天真,一切都真的那么不安全?我想唯一真正安全的方法是存储用户是否在授权服务器上通过身份验证并进行快速布尔检查以查看用户是否在每个服务器操作之前登录.
正如Banthar在评论中所说,应始终在服务器上执行授权检查.
实现此类事情的标准方法是使用令牌:客户端向服务器发送用户名和密码.如果客户端提供的凭据成功进行身份验证,则服务器会生成安全令牌,将其存储在某处以供以后查询,并将令牌发送回客户端.对于服务器的每个后续请求,客户端应该发送令牌以及请求参数,允许服务器检查令牌是否有效.服务器只有在可以验证令牌是合法且授权的情况下才执行请求,任何疑问都应导致服务器撤销令牌.
此方法与您在帖子的最后部分中描述的方法非常相似.
服务器生成的令牌应该是一个无法伪造的值:它不能是为每个生成的令牌递增的简单整数值,因为黑客可以轻松预测有效值.由于同样的原因,它不能仅使用客户端可用的信息构建(尽管黑客需要更多的工作,但他最终可能伪造一个有效的令牌).此外,在服务器上,令牌应附加信息,允许服务器轻松且唯一地验证令牌:连接信息中的小变化应导致令牌被撤销.永远不应该重用令牌值(使用有限长度的令牌,仍然有可能重用令牌值,因此找出一个长度,这是安全性和实用性之间的良好折衷).最后,应在会话期间定期更新有效会话的令牌,以防止恶意用户对会话进行处理.
有很多方法可以实现这一点,但细节取决于您尝试实现的安全级别.使用某种秘密密钥在服务器上生成令牌通常是一个坏主意,因为密钥总是有可能泄露.生成令牌的时间也可以是可预测的.任何编程语言都可以使用的伪随机数生成器必须正确播种,以便无法预测数字序列.
最后,请注意,任何身份验证逻辑都不是完全安全的:在逻辑中构建更多安全性只会使黑客的工作变得更加困难.想想黑客闯入你的系统的动机,并设计你的逻辑,以便闯入系统的工作量不值得资源成本(时间,金钱,专业硬件......).并且永远不要忘记,默默无闻并不意味着安全:让人们审查您的流程并对其进行评论,他们可能会想到您没有看到的一些缺陷.