关于jasypt.org关于“可以解密加密密码吗?”的问题,它在这里写道:“如果您使用了一种消息解析技术对其进行加密,这正是您应该做的事情(通过使用PasswordEncryptor实现、StandardStringDigester或类似的.),您就不能了。”
我必须说,我尝试过不同的方式,但在我看来,我总是有同样的问题。我不知道为什么Jasypt让每个人都能解密到原值。例如,我可以轻松地加密它,但也可以使用mvn命令解密它:
使用jasypt加密和解密的示例:
加密:
mvn jasypt:encrypt-value -Djasypt.plugin.value="test" -Djasypt.encryptor.password="pass" -Djasypt.encryptor.algorithm="PBEWithMD5AndDES" -Djasypt.encryptor.key-obtention-iterations=1000 -Djasypt.encryptor.pool-size=1 -Djasypt.encryptor.provider-name="SunJCE" -Djasypt.encryptor.salt-generator-classname="org.jasypt.salt.RandomSaltGenerator" -Djasypt.encryptor.iv-generator-classname="org.jasypt.iv.NoIvGenerator" -Djasypt.encryptor.string-output-type="base64"如您所见,在第一个命令中,我提供了值"test“和密码"pass”以解密。它生成: ENC(u7uKa3B9Xfey+zZ46tOmag==)
这样,我就可以轻松地执行第二个命令,并获得原始值,即"test“。
解密:
mvn jasypt:decrypt-value -Djasypt.plugin.value="u7uKa3B9Xfey+zZ46tOmag==" -Djasypt.encryptor.password="pass" -Djasypt.encryptor.algorithm="PBEWithMD5AndDES" -Djasypt.encryptor.key-obtention-iterations=1000 -Djasypt.encryptor.pool-size=1 -Djasypt.encryptor.provider-name="SunJCE" -Djasypt.encryptor.salt-generator-classname="org.jasypt.salt.RandomSaltGenerator" -Djasypt.encryptor.iv-generator-classname="org.jasypt.iv.NoIvGenerator" -Djasypt.encryptor.string-output-type="base64"在我的.pom文件中,我在依赖项部分中定义了这一点:
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot</artifactId>
<version>3.0.2</version>
</dependency>此外,在build部件中(因此我可以通过maven执行jasypt ):
<plugins>
<plugin>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-maven-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugins>我的应用程序yml如下所示:
jasypt:
encryptor:
password: pass
algorithm: PBEWithMD5AndDES
key-obtention-iterations: 1000
pool-size: 1
provider-name: SunJCE
salt-generator-className: org.jasypt.salt.RandomSaltGenerator
iv-generator-className: org.jasypt.iv.NoIvGenerator
string-output-type: base64
spring:
datasource:
database-name: *****
jdbc-url: *****
username: *****
password: ENC(u7uKa3B9Xfey+zZ46tOmag==)而且一切都很好(我也通过java代码对bean进行了尝试,它完全相同,只是风格不同)。但是,我为什么要这样做呢?我知道黑客可以像我一样执行这个命令并获得实际价值:
他可以做到这一点,而且他拥有他所需要的一切--他可以从我的代码中读取"u7uKa3B9Xfey+zZ46tOmag==“和"pass”:解密:
mvn jasypt:decrypt-value -Djasypt.plugin.value="u7uKa3B9Xfey+zZ46tOmag==" -Djasypt.encryptor.password="pass" -Djasypt.encryptor.algorithm="PBEWithMD5AndDES" -Djasypt.encryptor.key-obtention-iterations=1000 -Djasypt.encryptor.pool-size=1 -Djasypt.encryptor.provider-name="SunJCE" -Djasypt.encryptor.salt-generator-classname="org.jasypt.salt.RandomSaltGenerator" -Djasypt.encryptor.iv-generator-classname="org.jasypt.iv.NoIvGenerator" -Djasypt.encryptor.string-output-type="base64"他只需要读取这个ENC(u7uKa3B9Xfey+zZ46tOmag==) (他可以从yml文件读取,也可以从yml文件读取"pass“(他也可以这样做)。就是这样,他可以拿回原来的价值。我看不出这里面有什么保安。黑客只需要知道如何执行mvn解密命令(在本例中我已经做到了,为什么有人也不会这么做),这与加密基本上是一样的。
有人可能会说,‘那么,您可以通过环境变量传递您的密码(" pass ")。对我不起作用。因为Gitlab和Dockerfile的两个文件,我都在项目中,如果我在那里设置这些变量,黑客仍然可以读取它,并在几秒钟内得到实际值。它们与我的项目有关。另外,在像Gitlab或Kubernetes这样的系统上提供实际的密码(比如环境变量)对我来说是非常危险的。黑客,如果他是非常先进的,也可以读取这些价值观。那为什么要揭发他们。这似乎是Jasypt的唯一解决方案,可以设置像APP_ENCRYPTION_PASSWORD这样的变量。
我的问题是,你能以某种方式禁用Jasypt解密,这样黑客也不能得到它的实际价值吗?对我来说这似乎是最安全的选择。或者类似的解决方案来解决我的问题?如果可以的话,请提供一个例子。-- Jasypt可以在动态的情况下生成密码,就像它生成盐一样,但是它是如何生成的。我知道,那么person应该动态地填充yml文件,这是不可能的。如果我只需要密码和加密的值来解密原始值的话,我真的无法理解Jasypt的安全性。这两位黑客都可以在源代码中阅读,在我看来,这似乎是非常糟糕的安全性。然后,在yml文件中屏蔽数据库密码字的目的是什么。如果一切都能在几秒钟内打开。在我看来这是很弱的安全措施。请告诉我如何使它比现在更安全。
发布于 2021-07-01 18:27:58
“如果您使用消息解析技术对其进行加密,则.您不能。
这是令人遗憾的提法。您可以加密数据(可逆)或散列(不可逆)。
其实有很多这样的问题,所以,只要搜索它。如果您有服务的秘密(例如DB凭据、API密钥),您可以对它们进行加密,但是您也需要在某个地方拥有密钥。
很好,您可以通过环境变量传递密码(" pass ")。
这是从代码中分离秘密的最简单方法。你应该决定什么是威胁,什么是你想要保护的,以及如何防范。如果您限制了这种可能性,那么使用环境变量或部署参数可以帮助源代码泄漏秘密。
此外,在Gitlab或Kubernetes这样的系统上提供实际的密码(如环境变量)对我来说也是非常危险的。
如果有人访问了你的电脑,那就不是你的电脑了。使用kubernetes秘密或无源保险库,管道参数,.它可以帮助你将秘密从代码库中分离出来。
哈克,如果他是非常先进的,也可以读取这些值。
如果有人可以冒充您或应用程序,那么您对此无能为力。这就是为什么你需要阻止它(最少的特权,所有层的安全性,..)
我的问题是,你能以某种方式禁用Jasypt解密,这样黑客也不能得到它的实际价值吗?
。。然后您的应用程序也将无法获得它,应用程序将无法访问db或其他服务。
有不同方式的身份验证选项(例如Kerberos),但我个人试图避免它,因为配置和故障排除并不简单。然后我们保存在环境或部署管道中某个地方的密码和密钥。
https://stackoverflow.com/questions/68211127
复制相似问题