Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/52.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails ActiveSupport::CachingKeyGenerator上的内存使用问题_Ruby On Rails_Ruby_Encryption - Fatal编程技术网

Ruby on rails Rails ActiveSupport::CachingKeyGenerator上的内存使用问题

Ruby on rails Rails ActiveSupport::CachingKeyGenerator上的内存使用问题,ruby-on-rails,ruby,encryption,Ruby On Rails,Ruby,Encryption,为了在数据库中加密和存储用户信息,我的Rails应用程序使用salt(每个用户)使用ActiveSupport::KeyGenerator生成key。但是,generate_key方法执行的默认迭代是2**16[1]。在每次读取(用于解密)和写入(用于加密)时使用用户的salt执行密钥生成会降低我的应用程序的速度 我发现,如果用于生成密钥的salt和length保持不变,则可以使用ActiveSupport::CachingKeyGenerator来缓存密钥[2]。在内部,它使用Concurre

为了在数据库中加密和存储用户信息,我的Rails应用程序使用
salt
(每个用户)使用
ActiveSupport::KeyGenerator
生成
key
。但是,
generate_key
方法执行的默认迭代是
2**16
[1]。在每次读取(用于解密)和写入(用于加密)时使用用户的
salt
执行密钥生成会降低我的应用程序的速度

我发现,如果用于生成密钥的
salt
length
保持不变,则可以使用
ActiveSupport::CachingKeyGenerator
来缓存密钥[2]。在内部,它使用
Concurrent::Map
[3]来缓存密钥。使用
ActiveSupport::CachingKeyGenerator
提高了我的应用程序的性能,因为它并不总是生成密钥

这是否会将我的应用程序的内存使用率提高到可以关闭应用程序的程度?

参考资料:

  • 共享“有效”解决方案

    由于
    ActiveSupport::CachingKeyGenerator
    使用
    Concurrent::Map
    ,我发现缓存键将导致内存使用量增加,与用户数量成正比(前提是所有请求都以某种方式路由到同一节点)

    为了解决这个问题,我编写了一个类似的
    CachingKeyGenerator
    ,它包装了
    ActiveSupport::KeyGenerator
    ActiveSupport::Cache::MemoryStore

    class CachingKeyGenerator
    BASE=Rails.application.secrets.secret\u key\u BASE
    LENGTH=ActiveSupport::MessageEncryptor.key\u len
    密钥到期日=1.5天
    def初始化
    @key\u generator=ActiveSupport::KeyGenerator.new(Rails.application.secrets.secret\u key\u base)
    @keys\u cache=ActiveSupport::cache::MemoryStore.new(过期时间:KEY\u过期时间)
    结束
    def生成密钥(salt)
    key=@keys\u cache.fetch(salt)
    如果是key.nil?
    key=@key\u生成器。生成密钥(salt,长度)
    @密钥\缓存写入(salt,密钥)
    结束
    钥匙
    结束
    结束
    
    根据Rails文档,
    ActiveSupport::Cache::MemoryStore
    是线程安全的,并且实现了基于LRU的清理机制[1]。这将使缓存的内存使用具有确定性—为内存存储设置大小限制(默认值—32Mb,可在初始化期间定义)

    附言:尚未在生产中部署,如果我遇到任何意外问题,将在这里更新


    [1]

    真的吗?你有多少用户?按键不会占用太多空间。我们有大约一百万用户。这要看情况而定。我建议在接近真实的数据量上使用内存分析,而不是依赖于论坛的意见:)也许,不缓存所有内容也是有意义的——用户的活动配置文件可能非常不同,并且(粗略地说)有20%的用户对您的基础设施造成80%的压力。仅缓存它们的密钥将通过合理的内存权衡减少性能问题。。。