Rails 5.1.1 新特性 [添加新的加密的 secret] 示例

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: Rails 5.1.1 新特性 [添加新的加密的 secret] 示例

最近把 App 从 Rails 5.0.2 升级至 5.1.1,升级过程还算顺利。

既然升级到 Rails 5.1.1,所以就迫不及待的想使用一下这个新的特性。

在 Rails 5.1.1 之前,环境变量的设置在开发环境和生产环境里的设置总是避免不了的一种痛。 尤其是多台服务器部署更甚。

由于我的生产服务器用的是 nginx + passenger,因此无法直接读取环境变量。 后来参照网上一下建议,将一些私密信息直接写在 nginx 配置文件中。

passenger_env_var REDIS_PASSWD YOUR_REDIS_PASSWD;

对于多台服务器部署,一旦这些信息需要修改,就必须登陆每个服务器进行修改。

这严重不符合我们的 DRY 的精神 啊。

因此 Rails 5.1.1 引入了这个加密的 secret 特性。

使用方法:

首先,要安装,在你的 APP 目录下,运行以下命令

$ rails secrets:setup

这条命令会做三件事情:

  • 在.gitignore 里添加一条记录,忽略config/secrets.yml.key文件。
  • 创建config/secrets.yml.key文件, 这个文件保存的是RAILS_MASTER_KEY,一旦这个 key 丢失,就是神仙也帮补了你了
  • 创建config/secrets.yml.enc, 这个文件保存的是加密的 secret 信息

通常,在生产服务器可以把这个信息保存至你相应的 nginx 配置文件中,如:

#  /etc/nginx/sites-enabled/my-site.conf
passenger_env_var RAILS_MASTER_KEY YOUR_PASSWD;

后续需要添加新的 secret 时,运行命令:

$ rails secrets:edit

运行命令后会解密config/secrets.yml.enc文件中的内容,你可以按照普通的 yml 文件进行编辑。

应用:

在需要的时候可以在 APP 中,通过以下方式获取其中的 key 值。

Rails.application.secrets会返回所有的 secrets,包含 secret.yml 文件中的内容,或者也可以用 YOUR_APP_NAME::Application.secrets

使用某个值:

Rails.application.secrets.my_secret_key

哦对了,别忘了在config/enviroments/production.rb 文件中添加

config.read_encrypted_secrets = true

UPDATE: shared 如果有一部分需要在不同环境中共享的环境变量,可以这样写:

default: &default
    mykey: value
staging:
   <<: *default
production:
  <<: *default

还有一种更好的方法,使用shared

shared:
    mykey: value
staging:
  other: value
production:
  other_key: value

在 rails 控制台可以试试:

$ RAILS_ENV=production rails c
>> Rails.application.secrets
=> {:secret_key_base=>"3e3", :mykey=>"value"}

PS: 不过在开发环境是看不到 shared 下面的键值的。

相关文章
|
6月前
|
安全 算法 Java
JDK 9新特性:增强的加密算法支持
本文将深入探讨JDK 9中增强的加密算法支持这一新特性。随着网络安全威胁的日益严重,加密算法在保障数据安全方面起着至关重要的作用。JDK 9通过引入更多高效、安全的加密算法,提升了Java应用程序的加密能力。本文将详细介绍这些新加密算法的特点,以及如何在实际项目中应用这些新特性来提高数据的安全性。
|
Java API 数据安全/隐私保护
【小家java】java8新特性之---Base64加密和解密原理
【小家java】java8新特性之---Base64加密和解密原理
|
安全 Java 数据安全/隐私保护
【Android 安全】DEX 加密 ( 阶段总结 | 主应用 | 代理 Application | Java 工具 | 代码示例 ) ★(一)
【Android 安全】DEX 加密 ( 阶段总结 | 主应用 | 代理 Application | Java 工具 | 代码示例 ) ★(一)
268 0
|
安全 Java 数据安全/隐私保护
【Android 安全】DEX 加密 ( 阶段总结 | 主应用 | 代理 Application | Java 工具 | 代码示例 ) ★(三)
【Android 安全】DEX 加密 ( 阶段总结 | 主应用 | 代理 Application | Java 工具 | 代码示例 ) ★(三)
230 0
|
安全 Java Android开发
【Android 安全】DEX 加密 ( 阶段总结 | 主应用 | 代理 Application | Java 工具 | 代码示例 ) ★(二)
【Android 安全】DEX 加密 ( 阶段总结 | 主应用 | 代理 Application | Java 工具 | 代码示例 ) ★(二)
147 0
|
数据安全/隐私保护 NoSQL MongoDB
深入MongoDB4.2新特性:字段级加密 Client-Side Field Level Encryption
深入MongoDB4.2新特性:字段级加密 Client-Side Field Level Encryption
5016 0
|
NoSQL MongoDB 数据库
MongoDB 4.2新特性:分布式事务、字段级加密、通配符索引、物化视图
MongoDB 4.2已经发布,我们来看看它增加了哪些新特性?分布式事务?数据库加密?通配符索引?
2880 0
|
C# 数据安全/隐私保护 Windows
C#使用RSA证书文件加密和解密示例
修改MSDN上的示例,使之可以通过RSA证书文件加密和解密,中间遇到一个小问题。 Q:执行ExportParameters()方法时,回报CryptographicException:该项不适于在指定状态下使用(Key not valid for use in specified state)。
1595 0