【问题标题】:Phonegap Authentication without username/password没有用户名/密码的 Phonegap 身份验证
【发布时间】:2015-10-03 04:58:02
【问题描述】:

我有一个 phonegap 应用程序,我只希望 我的应用程序用户 访问我从中获取数据的 api。

我使用 php 作为后端。

我所做的是我创建了一个密钥并在服务器上验证该密钥。但是密钥在应用程序中是硬编码的,这意味着有人可以查看代码并找出密钥并将其作为参数传递并获得对我不想要的 api 的访问权限。

此外,使用代理也可以看到密钥。

有没有办法在应用程序和服务器上动态生成密钥,以便对其进行身份验证?或者其他方式。

我不希望用户提供任何类型的用户名/密码。

我不希望用户注册或登录..用户在身份验证中没有任何角色..我正在对 应用程序进行身份验证。

【问题讨论】:

    标签: php android cordova authentication


    【解决方案1】:

    是的,当然可以,

    但是在你开始之前有几件事。

    • 创建一个新的来存储我们所有的api键 当他们通过注册时为每个用户生成 应用

    PHP端:

    • 获取用户密码或任何独特的东西 例如:UDID Andriod,在 IOS 他们对 UDID 的访问受到限制,您可能需要存储一些 钥匙串中生成的唯一ID。
    • 然后当我们有密码UDID你可以把它们 一起(或任何你想要的)并用Sha1(或任何 加密算法)并保存到api密钥表
    • 每次请求命中 api 时,您都可以获取 api 密钥标头并使用数据库验证并查看。

    应用端:

    • 当用户通过应用登录如果成功将 api 密钥传递给用户将其保存在应用中以供进一步使用
    • 此外,当您要从 api 请求数据时,您可以 检索 应用内存储的api密钥,然后将其作为请求的标头并发送。

    一些额外的东西:

    • 您还可以在两侧(服务器和应用程序)创建私钥 然后将其存储在 api 密钥表加密请求 服务器和应用程序只知道使用私钥 两侧存储。
    • 您还可以进行高级身份验证,例如 oAuth

    【讨论】:

    • 我不希望用户注册或登录..用户在身份验证中没有任何角色..这仍然有效吗?
    • @krv 你为什么不想注册和登录??..我不推荐你这个..我的回答对你不起作用..还有你的** api 将是易受攻击的..你不能限制访问没有身份验证..你必须使用任何人都可以看到的硬代码。
    • @krv 那么它也不会是一个 api
    • 该应用程序可以用于儿童或农村地区的人,所以我不希望这样..在某种程度上我没有对用户进行身份验证,但我正在对应用程序进行身份验证..所以服务器逻辑是“是来自我的应用程序的请求”如果是,则发送数据,如果不是,则不要
    • @krv 我有个主意..您可以使用端到端 vpn 来做到这一点:)
    【解决方案2】:

    使用 SSL/TLS 中流行的算法 RSA。重点是私钥和公钥对。

    这是 PHP 的库和示例:

    Encrypt and Decrypt text with RSA in PHP

    这里是 Javascript 库:

    RSA Encryption Javascript

    我个人的建议是:在 ram 中协商一个随机密钥存储以供以后使用,而不是使用密钥对进行所有消息交换。因为它对服务器来说是一个高工作量(比客户端多 15 倍)。并且您可以定义一个对象来将会话密钥存储在私有成员中。

    funciton keyStoreObject() {
        this.publicKey = ''; //this is public
        var sessionKey = ''; //this is private
        this.negotiate() = function () { sessionKey = 123456; //You can access private sessionKey }
        this.decypt = function (str) {...}; //And write your code here
    }
    

    然后创建一个实例:

    var keyStore = new KeyStoreObject;
    //so now you can
    keyStore.negotiate();
    

    关于私人会员,请在此处阅读更多信息: http://javascript.crockford.com/private.html

    此外,您需要在服务器端实现会话密钥存储并包括过期时间。对于小型实例,可以使用serialize() 或 SQLite。

    实际上,sessionKey 并不完全安全(理论上)。桌面浏览器可以进行 DDoS 攻击。验证码等人工验证可以为您提供帮助。

    【讨论】:

      猜你喜欢
      • 2011-07-04
      • 1970-01-01
      • 2015-01-17
      • 1970-01-01
      • 2018-07-13
      • 2020-12-09
      • 2017-07-31
      • 2011-09-27
      • 2020-08-22
      相关资源
      最近更新 更多