我有一个使用单用户OAUTH令牌的应用。我可以直接在应用程序中存储四个值(消费者密钥/秘密,令牌/秘密),但不建议这样做,我不希望将秘密检入源代码。该应用程序不使用数据库。我知道无论我存储它们,有权访问服务器的人都可以解决它们,但我想至少从源代码中删除它。我曾经想过将它们作为Passenger环境变量传递或者将它们存储在服务器上的单独文件中但是有更好的方法吗?有没有必要对它们进行加密,因为任何可以看到它们的人都会有解密所需的访问权限?
答案 0 :(得分:0)
在最敏捷的设置(continuous deployment)中,没有将密码存储在源代码中实际上是不好的做法。
但是,按照你的说法,你想要有两个小组:那些可以制作代码的人,以及那些可以部署代码的人。可以部署它的人可以访问密钥,并且在最安全的设置中,不得使用应用程序的代码。您可以通过让那些编码代理所有授权部分的系统进行代理处理并对应用程序进行身份验证来使oauth工作。这些密钥(app - > auth middle man)可以在存储库中,因为它们是内部的。
任何其他设置:由可以部署,加密密钥的人创建的身份验证库,其他任何东西都可以被制作代码的人破坏。如果你不完全信任他们可以访问密钥,你可能不信任他们不要试图越狱密钥。
最终的部署方案要复杂得多,因此更容易产生错误。但是,它更安全。您仍然需要信任某人,例如安装操作系统的人,代理的系统中间件,维护代理机器的人,可以长期使用的人等等。如果能够访问密钥的人群足够小,并且您信任他们,那么您就获得了安全性。否则,你失去了安全感,能够应对变化,浪费了很多人的时间。
不幸的是,所有授权方案都要求您信任某人。没办法解决它。这适用于任何应用程序/框架/授权方案,不仅包括sinatra,rails,oauth,java,rsa签名,椭圆曲线等。