面试题答案
一键面试1. 哈希算法与盐值概念
- 哈希算法:哈希算法是一种将任意长度的数据转换为固定长度值(哈希值)的函数。在密码存储中,常用的哈希算法如BCrypt、SHA-256等。哈希算法具有单向性,即从哈希值很难反向推导出原始数据。
- 盐值(salt):盐值是一个随机生成的字符串,与用户密码组合后再进行哈希计算。盐值的作用是增加密码的随机性,即使两个用户使用相同的密码,由于盐值不同,哈希后的结果也不同,防止彩虹表攻击。
2. 在Ruby on Rails中安全存储和验证密码
在Ruby on Rails中,通常使用bcrypt
gem来处理密码的哈希和验证。bcrypt
是一个广泛使用且安全的密码哈希库。
安装bcrypt gem
在Gemfile
中添加:
gem 'bcrypt'
然后运行bundle install
。
关键代码示例
假设我们有一个User
模型:
class User < ApplicationRecord
has_secure_password
end
在数据库迁移文件中,确保为User
表添加password_digest
字段:
class CreateUsers < ActiveRecord::Migration[6.0]
def change
create_table :users do |t|
t.string :email
t.string :password_digest
t.timestamps
end
end
end
代码安全性详细解释
has_secure_password
:这是Rails提供的一个宏,它使用bcrypt
库来处理密码。当你创建一个新用户时,比如:
user = User.new(email: 'example@example.com', password: 'password123', password_confirmation: 'password123')
user.save
Rails会自动生成一个盐值,并将密码和盐值组合后进行哈希计算,将结果存储在password_digest
字段中。这个过程是不可逆的,即使数据库泄露,攻击者也无法从password_digest
还原出原始密码。
- 密码验证:在用户登录时,当你调用
user.authenticate('password123')
,Rails会使用存储在password_digest
中的哈希值和用户输入的密码,结合盐值进行验证。它会重新计算输入密码的哈希值,并与存储的哈希值进行比较。由于使用了盐值,即使两个用户密码相同,其哈希值也不同,增加了安全性。
这样通过bcrypt
和Rails的has_secure_password
,可以安全地存储和验证用户密码,有效防止密码泄露后被轻易破解。