ruby拥有多种单向加密的方法,这里主要介绍两种常用的加密方式。首先是bcrypt,使用bcrypt gem 可以很方便的加密包含敏感信息的文本字符串,该gem使用基于盐(solt)的加密技术来散列原始文本密码,以便于比较密码是否匹配。例如,
require ‘bcrypt’
# 加密
my_pwd = “123456”
pwd = BCrypt::Password.create(my_pwd)
=> “$2a$12$ivlboHoZD4lJeQTITG5YjeKV52F57pdxuk2SpRTJyKzLg2D8RSXi2”
# 验证
pwd = BCrypt::Password.new(“$2a$12$ivlboHoZD4lJeQTITG5YjeKV52F57pdxuk2SpRTJyKzLg2D8RSXi2”)
pwd == “123456”
=> true
pwd == “12345”
=> false
如果想手动传递一个盐值,可以使用BCrypt::Engine.hash_secret(my_pwd, salt)生成密码哈希值,和BCrypt::Password.create(my_pwd)自动生成随机盐值的加密效果是一样的。例如,
# 加密
my_pwd = “123456”
salt = BCrypt::Engine.generate_salt
pwd = BCrypt::Engine.hash_secret(my_pwd, salt)
=> “$2a$12$ivlboHoZD4lJeQTITG5YjeKV52F57pdxuk2SpRTJyKzLg2D8RSXi2”
# 验证
BCrypt::Password.new(pwd) == “123456”
=> true
如果你想调整散列的代价,可以使用“cost”参数来调整bcrypt的代价值,这样可以增加密码猜测攻击的难度,”cost”值越高,散列的时间和资源消耗越大,一般用于对极其敏感的数据进行更高安全的保护。例如,
my_pwd = “123456”
salt = BCrypt::Engine.generate_salt(cost: 10)
BCrypt::Engine.hash_secret(my_pwd, salt)
另一种是ruby内置的OpenSSL库,其中常用的有MD5,SHA1,SHA256,SHA512等。这里需要注意的是MD5,SHA1已经被证明是不安全的,所以建议使用更安全的算法SHA256及以上或者bcrypt来加密字符串。例如,
require ‘digest’
text = “123456”
# MD5 加密
encrypted = Digest::MD5.hexdigest(text)
# SHA1 加密
encrypted = Digest::SHA1.hexdigest(text)
# SHA256 加密
encrypted = Digest::SHA256.hexdigest(text)
# SHA512 加密
encrypted = Digest::SHA512.hexdigest(text)