首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Jasypt进行安全加密?

如何使用Jasypt进行安全加密?
EN

Stack Overflow用户
提问于 2021-07-01 13:29:49
回答 1查看 998关注 0票数 0

关于jasypt.org关于“可以解密加密密码吗?”的问题,它在这里写道:“如果您使用了一种消息解析技术对其进行加密,这正是您应该做的事情(通过使用PasswordEncryptor实现、StandardStringDigester或类似的.),您就不能了。”

我必须说,我尝试过不同的方式,但在我看来,我总是有同样的问题。我不知道为什么Jasypt让每个人都能解密到原值。例如,我可以轻松地加密它,但也可以使用mvn命令解密它:

使用jasypt加密和解密的示例:

加密:

代码语言:javascript
复制
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“。

解密:

代码语言:javascript
复制
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文件中,我在依赖项部分中定义了这一点:

代码语言:javascript
复制
<dependency>
    <groupId>com.github.ulisesbocchio</groupId>
    <artifactId>jasypt-spring-boot</artifactId>
    <version>3.0.2</version>
</dependency>

此外,在build部件中(因此我可以通过maven执行jasypt ):

代码语言:javascript
复制
<plugins>
    <plugin>
      <groupId>com.github.ulisesbocchio</groupId>
      <artifactId>jasypt-maven-plugin</artifactId>
      <version>3.0.2</version>
    </plugin>
<plugins>

我的应用程序yml如下所示:

代码语言:javascript
复制
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”:解密:

代码语言:javascript
复制
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文件中屏蔽数据库密码字的目的是什么。如果一切都能在几秒钟内打开。在我看来这是很弱的安全措施。请告诉我如何使它比现在更安全。

EN

回答 1

Stack Overflow用户

发布于 2021-07-01 18:27:58

“如果您使用消息解析技术对其进行加密,则.您不能。

这是令人遗憾的提法。您可以加密数据(可逆)或散列(不可逆)。

其实有很多这样的问题,所以,只要搜索它。如果您有服务的秘密(例如DB凭据、API密钥),您可以对它们进行加密,但是您也需要在某个地方拥有密钥。

很好,您可以通过环境变量传递密码(" pass ")。

这是从代码中分离秘密的最简单方法。你应该决定什么是威胁,什么是你想要保护的,以及如何防范。如果您限制了这种可能性,那么使用环境变量或部署参数可以帮助源代码泄漏秘密。

此外,在Gitlab或Kubernetes这样的系统上提供实际的密码(如环境变量)对我来说也是非常危险的。

如果有人访问了你的电脑,那就不是你的电脑了。使用kubernetes秘密或无源保险库,管道参数,.它可以帮助你将秘密从代码库中分离出来。

哈克,如果他是非常先进的,也可以读取这些值。

如果有人可以冒充您或应用程序,那么您对此无能为力。这就是为什么你需要阻止它(最少的特权,所有层的安全性,..)

我的问题是,你能以某种方式禁用Jasypt解密,这样黑客也不能得到它的实际价值吗?

。。然后您的应用程序也将无法获得它,应用程序将无法访问db或其他服务。

有不同方式的身份验证选项(例如Kerberos),但我个人试图避免它,因为配置和故障排除并不简单。然后我们保存在环境或部署管道中某个地方的密码和密钥。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68211127

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档