我正在构建一个与服务器通信的移动应用程序。我希望通信尽可能安全,但我没有这个领域的经验。
应用程序首次启动时,app会向服务器提交电话号码,通过短信获取一个6位数的代码,然后将这些6位数字提交给服务器。假设6位代码有效,服务器将返回移动应用程序的API秘密(长唯一字符串)以保存在移动应用程序上。我这样做,所以当用户在另一台设备上重新安装应用程序时,服务器将撤销对旧移动设备的访问(即:API密码将不再有效)。
我从哪里开始?我的目的是使用API密钥来保护从移动应用程序到服务器的所有未来通信(即:注册后的所有通信)。我从之前使用过的不同API中获取了这个想法,在那里我看到每个API用户都获得了API密钥/秘密。在那些API中,我注意到API秘密以下列方式使用,但我不知道这是否是我需要的。
params = {"method": api_function_name,
"order": 'DESC'
"key": CLIENT_SPECIFIC_API_KEY,
}
params = urllib.urlencode(params)
H = hmac.new(CLIENT_SPECIFIC_API_SECRET, digestmod=hashlib.sha512)
H.update(params)
sign = H.hexdigest()
任何人都可以帮我弄清楚我需要做什么吗?
答案 0 :(得分:0)
我需要从这里做什么
为了获得良好的安全性,您应该做的第一件事就是弄清楚沟通对谁应该是安全的。
这个特定应用程序要做的一件事是为服务器设计一种方法,以确定哪个设备应该在“重新安装”的情况下替换哪个设备。
问题中的代码看起来像是通过客户端和服务器之间的机密通道对客户端进行身份验证的一种不错的方式。客户端将(params, sign)
发送到服务器,对吗?
答案 1 :(得分:0)
从您的第一篇文章中我可以看到您正在计算CLIENT_SPECIFIC_API_SECRET的哈希值。我假设你可以存储散列形式而不是原始CLIENT_SPECIFIC_API_SECRET?这通常在服务器端完成,以防止密码在黑客的情况下被暴露。这对于单一黑客可能导致大量客户端密码泄露的服务提供商尤为重要。
在使用CLIENT_SPECIFIC_API_SECRET来验证客户端实例方面,肯定存在现有技术。一个很好的基本示例是HTTP Authentication RFC 2617中指定的摘要式身份验证机制 - 具体请参阅摘要式身份验证部分。请注意,此RFC显示HTTP的摘要式身份验证,但基本原则可以应用于HTTP之外。例如,摘要式身份验证也用于IMS SIP。
要对设备进行身份验证,每次设备打开与服务器的连接时,您都可以使用“摘要式身份验证”步骤。当然连接应该加密(TCP与SSL)以防止人在中间攻击。