我需要一个受信任的插件或一种方法来加密Grails 配置文件中的某些文本以及 DataSource 中的数据库密码。因为它们是敏感数据,例如电子邮件用户名和密码。 有没有一种强大而可靠的方式来做到这一点
答案 0 :(得分:3)
不是通过插件,但可以将这些敏感的配置设置隐藏在外部文件中,然后在外部文件上设置适当的文件权限,以便只有特定用户才能访问它们。
在Config.groovy
内,有一个外部configuration files的设置:
grails.config.locations = [
"classpath:${appName}/externalDb.properties",
...
]
在DataSource.groovy
内,典型的安排可能是:
dataSource {
username = "yourUser"
password = "yourPassword"
...
}
在externalDb.properties
(受文件系统保护)中,您将拥有用户名/密码/电子邮件/等。重写:
dataSource.username = "prodUser"
dataSource.password = "secret1!"
您可以将Config.groovy
设置保留在原位,只有在找到外部配置文件时才会覆盖它们。您可以通过使用prod上的外部文件并依赖开发环境的Config.groovy
设置来利用此优势;您也可以将此逻辑应用于每个环境使用不同的外部配置文件(我们在工作时使用JNDI,但我认为这种内置grails功能更加容易)。
答案 1 :(得分:1)
以下是我们如何做到的
我们在Config.Groovy中定义了密码,如下所示
password = DESCodec.decode("String Returned by the output of encode")
class DESCodec {
def static encode = { String target ->
def cipher = getCipher(Cipher.ENCRYPT_MODE)
return cipher.doFinal(target.bytes).encodeBase64() as String
}
def static decode = { String target ->
def cipher = getCipher(Cipher.DECRYPT_MODE)
return new String(cipher.doFinal(target.decodeBase64())) as String
}
private static getCipher(mode) {
def keySpec = new DESKeySpec(getPassword())
def cipher = Cipher.getInstance("DES")
def keyFactory = SecretKeyFactory.getInstance("DES")
cipher.init(mode, keyFactory.generateSecret(keySpec))
return cipher
}
private static getPassword() {
"testsaltString".getBytes("UTF-8")
}
static void main(args) {
println args
if(args.length == 1) {
println encode(args[0])
} else {
println decode(args[1])
}
}
}
从命令行运行
groovy DESCodec.groovy'password'
获取字符串的密文,并使用密文 配置文件......