© 2023 Feiniao, Inc. All rights reserved.

如何用ruby对文本进行单向加密 - 怎么用ruby对文本进行单向加密?

Ruby OpenSSL
单向加密是一种加密技术,它可以将明文转换为密文,但无法将密文转换回明文。这种加密方式也被称为哈希函数或摘要算法。它通常用于存储密码,以确保即使攻击者获得了密码文件,也无法轻易地查看密码明文。
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)