c# - 通过 PHP REST api 使用 C# 进行安全身份验证和请求

标签 c# php security authentication encryption

简介

好的,我已经有了一个带有数据库 (MySQL) 的网站 (PHP)。您可以在此网站上创建一个帐户并编辑您的详细信息等(比如出生日期、真实姓名、地址等)。

现在,我想做的是创建一个桌面应用程序(很可能是带有 WPF 的 c#),它与来自网站的 REST api(用 PHP)交互,这将允许:

  • 直接从应用程序创建帐户
  • 登录到您的帐户
  • 能够直接从应用程序编辑您的详细信息

到目前为止我只想做一个桌面应用程序,但它可能会演变成一个移动应用程序。不过我认为这无关紧要。

创建账户并登录

我正在为创建帐户/登录部分而苦苦挣扎。我希望它尽可能安全。在网站上,我使用成本为 10 的 password_hash(PASSWORD_BCRYPT) 将密码存储在数据库中,并使用 password-verify 来检查登录。

关于应用程序,我认为要走的路是将用户名和密码传递给 REST api,然后直接在服务器端进行加密。但是发送密码本身听起来很糟糕,所以我考虑使用只有应用程序和网站知道的 key 对其进行加密,以便网站可以计算出密码并将其正确编码到数据库中。

如果我是对的,我应该使用什么加密算法?如果没有,我应该怎么做?

直接从应用程序编辑您的详细信息

我正在考虑执行以下操作:假设用户已通过应用程序登录。如果身份验证成功,服务器会随机生成一个 token (我可能会使用 ircmaxell's Random-Lib )并将其作为对应用程序的回复发送。此后,当应用程序要向api发出请求时,它会将用户名添加到数据字符串中,并使用数据字符串和 token 生成哈希(例如sha256);然后服务器可以使用存储在数据库中的 token 重复确切的过程,以确保用户实际上有权访问/修改他的详细信息,并且没有人试图假装成他不是的用户。

我觉得问题在于,如果有人在身份验证后收听第一个 api 回复,他将获得 token 并可以使用它来充当用户。使用与密码相同的过程对其进行加密是否足以确保不会发生这种情况?

最后但同样重要的是,如果我希望用户在下次启动应用程序时能够直接登录,我想我必须给 token 永久持久性并将其存储在文件或其他东西中电脑。但这听起来并不安全,因为任何人都可以读取文件内容并找出 token 。

最后的问题

所以。你怎么认为 ?听起来不错还是我完全偏离了轨道?

网站托管在 http://* 中,所以我猜这里不能使用 HTTPS 通信。我知道创建真正安全的东西是个大问题,但我仍然想用我现有的东西做一些尽可能安全的东西。

非常感谢您的建议。 :)

顺便说一句,我试着尽可能清楚地说明这一点,希望它能奏效。我对安全、加密等知之甚少,所以你必须像 3 岁 child 一样跟我说话。

最佳答案

我认为我能给出的第一个也是最重要的建议是永远不要尝试推出您自己的安全代码,除非您是绝对的专家。您需要基于 .net 为您提供的框架组合一个解决方案。

首先是您的 REST API。我建议在 ASP.NET Web API 之上构建。 HTTPS 在这里是强制性的——如果您的托管服务提供商不能给您,您需要一个新的托管服务提供商。它还可以方便地为您处理加密。

有多种可用于 ASP 的安全选项,我会阅读此内容以获得详细概述:https://docs.asp.net/en/latest/security/ .使用现有的 ASP 选项还将满足您对用户帐户创建和自助服务的要求。

关于c# - 通过 PHP REST api 使用 C# 进行安全身份验证和请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40432140/

相关文章:

c# - DefiningQuery 且 <ModificationFunctionMapping> 元素中不存在 <DeleteFunction> 元素以支持当前操作

php - <tr> 和 <td> 标签覆盖 <pre>

javascript - 将值从一个字段传递到另一个字段

security - Struts 2 + 华夫饼 : User principal is always null

wcf - 为什么我可以在嗅探器中将 SSL 通信视为纯文本?

c# - 绑定(bind)到集合减少到它的属性之一

c# - 在 .NET Core 控制台应用程序 C# 中播放音频

c# - 带参数的异步 lambda 表达式

php - 我如何在 drupal db_query 中表示 longblob?

security - 限制 Clojure fn 的使用