【问题标题】:Managing Nonces in Apache/PHP在 Apache/PHP 中管理 Nonce
【发布时间】:2011-07-12 00:42:09
【问题描述】:

我一直在讨论关于 nonce 生成和 PHP 的各种问题,但没有找到任何关于管理 nonce 的“once”方面的细节的讨论。

这是我的情况。

我有一些 PHP 需要访问 web 服务,并且对 web 服务的请求需要我的 PHP 生成一个 nonce 并签署请求(即,我没有从 web 服务请求 nonce)。这部分很简单。

我正在努力寻找一个好的解决方案来防止在可能有多个会话进行时重复使用随机数。

在我看来,我可以做三件事。

一个,是在数据库中存储随机数/时间戳对,然后实现逻辑来检查数据库是否存在现有随机数,使旧随机数过期等。这也需要TRANSACTION或LOCK TABLE线程安全。呸。

二,是将 nonce 存储在 store 中,将 nonce 存储在 APC 中(在我的情况下不能使用 memcached),并让 TTL 处理过期。在这种情况下,线程安全是否需要将逻辑包装在 sem_acquire() / sem_release() 中,或者 apc_add() 是否真的是线程安全的?我主要关心的是如果apc_add() 或apc_store() 因为缓存已满而实际失败,如何处理这种情况。

三、是用Cache_Lite代替APC。

还有其他选择吗?据我所知,OpenID 使用 Cache_Lite 管理随机数,所以我怀疑这是最好的解决方案,但我想在提交之前检查所有选项。

谢谢。

【问题讨论】:

    标签: php apache nonce


    【解决方案1】:

    第一,是在数据库中存储随机数/时间戳对,然后实现逻辑来检查数据库是否存在现有随机数、过期旧随机数等。这还需要一个 TRANSACTION 或 LOCK TABLE 以确保线程安全。呸。

    您可以在没有表锁定的情况下执行此操作。只要您使用的数据存储是ACID compliant,它就会为您完成所有艰苦的工作。这意味着如果您使用的是 MySQL,则使用 InnoDB 表。

    创建一个表,其中包含 nonce、创建时间、最长生命周期和使用时间的字段。使 nonce 成为主键或唯一的。要分配随机数,请插入表中。如果您遇到重复键错误(或使用事务并遇到死锁或类似问题),请捕获它并生成新的随机数。

    如果您使用 an adequate randomness generator like openssl_random_pseudo_bytes 并且正在为 nonce 收集足够的字节,那么一开始发生冲突的可能性就很小。

    当您需要将 nonce 标记为已使用时,请对 nonce 行执行简单的 UPDATE同时要求已使用的列为 null。更新将返回修改的行数(如果您使用事务,则返回死锁)。如果修改的行数为零或者您遇到了死锁,那么其他东西已经将 nonce 标记为已消耗,您可以向用户返回适当的错误。

    请记住,设计了适当的数据库引擎来处理这种废话。不要重新发明轮子。

    【讨论】:

    • 谢谢。我没有想到这种方法。
    • 您会推荐date_consumed 成为DATETIME 还是TIMESTAMP?
    猜你喜欢
    • 2016-03-29
    • 2020-02-23
    • 2016-06-05
    • 2016-10-09
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多