Pyramid的pyramid.authentication.AuthTktAuthenticationPolicy
函数的'秘密'参数究竟是什么? documentation表示它是用于auth_tkt cookie签名的“(字符串)。必需。” tutorial表示它是“表示由此策略表示的'身份验证票据'机器使用的加密密钥的字符串”。
什么是auth_tkt cookie签名?什么是“认证机票”机器?这个秘密应该是我作为哈希存储在数据库中的东西吗?我真的很困惑。
答案 0 :(得分:14)
tkt auth cookie是几条信息的安全散列,包括用户名和可选的时间戳,但不包括用户密码。一旦通过身份验证,您就会向用户提供这样的cookie,每次用户返回时,您只需再次提取用户名并知道它是同一个用户。
要保持此Cookie安全,您需要拥有服务器端密码。只有拥有该秘密的服务器才能创建这些cookie;如果攻击者掌握了它,他可以为任意用户生成身份验证cookie,而无需知道这些用户的密码。
策略的secret
参数是服务器端密钥;它就像是服务器的主密码。如果您为站点运行多个进程(并且通常使用WSGI),则需要在整个进程中保持一致,以确保每个进程都可以验证cookie。您可以在配置文件,源代码或数据库中指定它;这取决于您需要多大的灵活性,您的安全策略,以及您是否需要与其他系统共享密钥。
您可以使用相同的标准与您网域中还需要对用户进行身份验证的其他系统共享此密钥。例如,Apache有一个mod_auth_tkt
模块,Plone使用相同的标准,通过共享秘密,您可以为不同Web应用程序中的用户提供单点登录。
请注意,更改密码意味着现有会话无效,用户必须重新进行身份验证。
在任何情况下,现有的Cookie都可能具有有限的使用寿命;如果在策略上配置timeout
参数,则嵌入的时间戳会限制它被接受为有效的时间长度。设置超时并结合重发时间是一个很好的策略;任何在超时内重新访问您的应用程序的用户都将重新发布一个带有新时间戳的新cookie,以保持其会话新鲜。这样,如果您的用户不返回,您的会话cookie将自动过期,并且攻击者可以在以后重复使用他们的cookie。 reissue
参数可让您控制新令牌的发布速度;在reissue
秒内重新访问您的服务器不会产生新令牌。
答案 1 :(得分:1)
据我记忆,秘密参数只是一个字符串,用作创建cookie的盐。你可以放任何你想要的东西。将它放在配置文件中应该绰绰有余。将它保存在数据库中可能会有点过分但是如果你想使创建的任何东西无效,我想改变秘密会使所有的cookie和会话创建失效。