【问题标题】:Security between native iOS app and server本机 iOS 应用程序和服务器之间的安全性
【发布时间】:2014-12-29 11:55:11
【问题描述】:

我正在开发一个原生 iOS 应用,并有一个通过 HTTPS 通信的后端 PHP 服务器。

我现在可以使用用户名/密码登录、facebook 或 google 登录来登录。 服务器将生成一个令牌并将其发送给用户。用户将在每次调用服务器时使用它。

但是: - 服务器“家伙”选择在每次拨打电话时发送一个新令牌。我认为这是一个糟糕的设计,有几个原因。 - 它应该过期吗?如果是这样,我怎样才能为用户体验无缝更新令牌?如果没有,这不是很脆弱吗?

上面是一个好的设计吗?我也想知道你们使用什么作为安全设计?

干杯。

【问题讨论】:

    标签: ios security authentication client server


    【解决方案1】:

    为了保护设备中的令牌,使用 SSKeyChain 而不是 NSUserDefaults 。无需为每次调用生成一个新的 Token。对于每次登录/注册,使用都可以生成一个令牌。

    【讨论】:

    • 没有过期不存在安全问题吗?
    • 不是这样,但如果你愿意,仍然可以。如果令牌不匹配,则更新令牌并在应用程序中发送回登录屏幕。
    • "如果令牌不匹配..." 你会用现有令牌更新令牌吗?
    • @Nam :这也可以是一个解决方案,但最好让用户进入登录屏幕
    • 好的,我真的很想优先考虑用户体验——他们不必一直登录。我可以将用户名/密码存储在 SSKeyChain 中,并在 FaceBook 和 Google+ 上使用刷新令牌。但是我在所有这些基于令牌的身份验证中都是一个新手,并且不确定为什么用令牌更新令牌不是最好的主意。你有设计模式的例子吗?
    【解决方案2】:

    将令牌存储在 SSKeyChain 中。使用此方法可以重复使用相同的令牌。

    - (NSString *)getUniqueDeviceIdentifierAsString
    {
        NSString *appName=[[[NSBundle mainBundle] infoDictionary] objectForKey:(NSString*)kCFBundleNameKey];
    
        NSString *strApplicationUUID = [SSKeychain passwordForService:appName account:@"incoding"];
        if (strApplicationUUID == nil)
        {
            strApplicationUUID  = [[[UIDevice currentDevice] identifierForVendor] UUIDString];
            [SSKeychain setPassword:strApplicationUUID forService:appName account:@"incoding"];
        }    
        return strApplicationUUID;
    }
    

    【讨论】:

    • 不会过期没有安全问题吗?
    • @Nam 您可以保留一周或一个月的有效期,而不是每次都发送新令牌。最好的方法是将令牌存储在钥匙串中,并在每次用户访问应用程序时调用它,这样用户就不需要再次登录。令牌应仅在注销然后重新登录或修复过期期后重新生成。
    • 在所有这些基于令牌的身份验证中,我都是一个新手。你有一个很好的设计模式的例子吗?
    • 感谢您的链接。在处理登录时,我并不是那么不安全的代码,而是对您使用的架构/模式更感兴趣。您将/如何实施您的身份验证?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多