Rails 5 has_secure_token 加密
Rails 5 has_secure_token encryption
在 Rails has_secure_token
gem/feature 上的 Ruby 中,它会在创建记录时创建一个唯一标记,并将其作为纯文本存储在数据库中。如果我使用该令牌授予用户对 API 的访问权限,将该令牌作为纯文本存储在数据库中是否存在安全风险?
我希望有一种方法可以在 has_secure_token
方法将令牌提交到数据库时加密 token
列,类似于 bcrypt
将密码加密到数据库中的方式.
我曾尝试使用 attr_encrypted
等 gems 来存储令牌的哈希值,但它似乎与 has_secure_token
不兼容。这是我的模型当前的设置方式:
class User < ApplicationRecord
has_secure_token :token
# attr_encrypted :token, key: :encrypt_token, attribute: 'token'
# def encrypt_token
# SecureRandom.random_bytes(32)
# end
end
注释的代码是 attr_encrypted
已证明不兼容的代码。如果有人知道是否有一种方法可以安全地加密数据库中的列,同时还使用 has_secure_token
,我将不胜感激!
如果需要更多信息或者这令人困惑,请告诉我。提前致谢!
Rails 6 ActiveModel::SecurePassword#has_secure_password 接受属性名称参数,并将使用 BCrypt 设置相应 #{attribute}_digest
列的值。默认属性名称是 password
并且模型必须具有 #{attribute}_digest
属性的访问器。
包含密码和 api_token 的简化示例:
rails generate model User password_digest:string api_token_digest:string
Rails 6
class User < ApplicationRecord
has_secure_password #create a `password` attribute
has_secure_password :api_token, validations: false
before_create do
self.reset_token = SecureRandom.urlsafe_base64
end
end
在Rails6之前可以直接调用BCrypt加密token
require 'bcrypt'
class User < ApplicationRecord
has_secure_password #create a `password` attribute
before_create do
cost = ActiveModel::SecurePassword.min_cost ? BCrypt::Engine::MIN_COST : BCrypt::Engine.cost
self.api_token = SecureRandom.urlsafe_base64
self.api_token_digest = BCrypt::Password.create(api_token, cost: cost)
end
end
在 Rails has_secure_token
gem/feature 上的 Ruby 中,它会在创建记录时创建一个唯一标记,并将其作为纯文本存储在数据库中。如果我使用该令牌授予用户对 API 的访问权限,将该令牌作为纯文本存储在数据库中是否存在安全风险?
我希望有一种方法可以在 has_secure_token
方法将令牌提交到数据库时加密 token
列,类似于 bcrypt
将密码加密到数据库中的方式.
我曾尝试使用 attr_encrypted
等 gems 来存储令牌的哈希值,但它似乎与 has_secure_token
不兼容。这是我的模型当前的设置方式:
class User < ApplicationRecord
has_secure_token :token
# attr_encrypted :token, key: :encrypt_token, attribute: 'token'
# def encrypt_token
# SecureRandom.random_bytes(32)
# end
end
注释的代码是 attr_encrypted
已证明不兼容的代码。如果有人知道是否有一种方法可以安全地加密数据库中的列,同时还使用 has_secure_token
,我将不胜感激!
如果需要更多信息或者这令人困惑,请告诉我。提前致谢!
Rails 6 ActiveModel::SecurePassword#has_secure_password 接受属性名称参数,并将使用 BCrypt 设置相应 #{attribute}_digest
列的值。默认属性名称是 password
并且模型必须具有 #{attribute}_digest
属性的访问器。
包含密码和 api_token 的简化示例:
rails generate model User password_digest:string api_token_digest:string
Rails 6
class User < ApplicationRecord
has_secure_password #create a `password` attribute
has_secure_password :api_token, validations: false
before_create do
self.reset_token = SecureRandom.urlsafe_base64
end
end
在Rails6之前可以直接调用BCrypt加密token
require 'bcrypt'
class User < ApplicationRecord
has_secure_password #create a `password` attribute
before_create do
cost = ActiveModel::SecurePassword.min_cost ? BCrypt::Engine::MIN_COST : BCrypt::Engine.cost
self.api_token = SecureRandom.urlsafe_base64
self.api_token_digest = BCrypt::Password.create(api_token, cost: cost)
end
end