如何在R中用Keyring实现Windows认证连接DSN,规避明文密码?
解决方案:用Keyring统一管理数据库连接,搞定Windows认证+避免重复改密码
我来帮你解决这两个数据库连接的问题——实现Windows认证的安全连接,同时用Keyring工具统一管理密码,再也不用每个数据库脚本都重复改密码了:
一、实现Windows认证的ODBC连接(结合Keyring)
首先澄清一点:Windows集成认证(也就是你说的Trusted Connection)的ODBC连接其实不需要输入密码,不过我们可以用Keyring来存储DSN名称、用户名这类配置,避免硬编码在脚本里,更安全也更灵活。
1. 先搞定Keyring的基础设置
先安装并加载Keyring包:
install.packages("keyring") library(keyring)
然后把你的Oracle DSN名称、用户名(如果需要)存入系统安全存储(Windows的凭据管理器、macOS的钥匙串这类):
# 存储DSN名称,service可以自定义,比如叫"oracle_prod" key_set(service = "oracle_prod", username = "dsn_name", password = "oracledb") # 存储用户名(如果你的连接需要的话) key_set(service = "oracle_prod", username = "uid", password = "tst")
2. 用Windows认证连接Oracle
现在连接的时候,直接从Keyring读取配置,加上Windows认证的参数就行:
library(DBI) library(odbc) # 从Keyring取出配置 dsn_name <- key_get(service = "oracle_prod", username = "dsn_name") uid <- key_get(service = "oracle_prod", username = "uid") # 建立Windows认证连接,用IntegratedSecurity=SSPI或者Trusted_Connection=Yes都可以 con <- dbConnect( odbc::odbc(), dsn = dsn_name, UID = uid, IntegratedSecurity = "SSPI" )
这样既实现了不用输密码的Windows认证,又避免了硬编码配置,一举两得。
二、统一管理Access DSN的密码,告别重复修改
针对Access DSN每3个月要改密码的痛点,我们把密码统一存在Keyring里,所有R脚本都从这里取密码,改密码时只需要更新Keyring里的值就行,不用碰每个连接脚本。
1. 把Access密码存入Keyring
运行一次下面的代码,把当前Access DSN的密码存进去:
# service自定义,比如叫"access_main",username填你的Access DSN名称 key_set(service = "access_main", username = "your_access_dsn_name", password = "current_password")
2. 从Keyring取密码连接Access
不管你用odbcConnect还是dbConnect,都可以这样读取密码:
方法1:用RODBC包的odbcConnect
library(RODBC) dsn_name <- "your_access_dsn_name" # 从Keyring取密码 pwd <- key_get(service = "access_main", username = dsn_name) access_con <- odbcConnect(dsn = dsn_name, uid = "tst", pwd = pwd)
方法2:用DBI+odbc包的dbConnect
library(DBI) library(odbc) dsn_name <- "your_access_dsn_name" pwd <- key_get(service = "access_main", username = dsn_name) access_con <- dbConnect( odbc::odbc(), dsn = dsn_name, UID = "tst", PWD = pwd )
3. 改密码时只需要更新Keyring
当3个月后需要改密码时,只需要运行这一行代码,输入新密码就行,所有脚本都会自动用上新密码:
key_set(service = "access_main", username = "your_access_dsn_name") # 运行后会弹出安全输入框,输入新密码,不用修改任何连接脚本!
三、几个实用小贴士
- Keyring会把密码存在系统自带的安全存储里,比明文写在脚本里安全太多,不用担心密码泄露。
- 可以把Keyring的初始化代码单独写一个脚本,只运行一次,之后所有连接脚本都只需要读取配置就行。
- 如果是团队协作,还可以创建共享密钥环(用
keyring_create),不过个人使用的话默认的密钥环就足够了。
内容的提问来源于stack exchange,提问作者New2Programming
相关产品推荐
相关产品推荐

