簡體   English   中英

如何使用 Jasypt 進行安全加密?

[英]How to make safe encryption with Jasypt?

在 jasypt.org 上關於問題“我可以解密加密的密碼嗎? ”它在這里說http://www.jasypt.org/faq.html#does-jasypt-implement-algorithms :“如果您使用消息摘要對其進行加密技術,這正是您應該做的(通過使用 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== )

有了這個,我可以輕松地執行第二個命令,我將獲得原始值,即“測試”。

解密:

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>

還有這個在構建部分(所以我可以通過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 文件中“傳遞”(他也可以這樣做)。就是這樣,他可以取回原始值. 我在這看不到任何安全性。黑客只需要知道如何執行 mvn 解密命令(在這個例子中我已經設法做到了,為什么有人也不會設法做到這一點),而且基本上是與加密相同。

有人可能會爭辯說,'好吧,您可以通過環境變量傳遞密碼(“pass”)'。 對我不起作用。 因為 Gitlab 和 Dockerfile 的兩個文件,我都在項目中,如果我在那里設置這些變量,黑客仍然可以讀取它並在幾秒鍾內獲得實際值。 他們綁定到我的項目。 此外,在 Gitlab 或 Kubernetes 等系統上提供環境變量等實際密碼對我來說似乎風險很大。 黑客,如果他非常先進,也可以讀取這些值。 那為什么要曝光他們。 似乎這只是 Jasypt 的解決方案,可以設置像 APP_ENCRYPTION_PASSWORD 這樣的變量。

我的問題是你能不能以某種方式禁用 Jasypt 解密,以便不取回實際價值,這樣黑客也不能得到它? 這對我來說似乎是最安全的選擇。 或者一些類似的解決方案來解決我的問題? 如果可以,請提供一個例子。 Jasypt 能夠以某種方式即時生成密碼會很好,就像它生成鹽一樣,但是如何生成。 我知道,那么人們應該動態填充 yml 文件,這是不可能的。 如果我只需要密碼和加密值來解密原始值,我真的不知道 Jasypt 是如何安全的。 這兩個黑客都可以讀取源代碼,在我看來,這似乎是非常糟糕的安全性。 然后,在yml文件中屏蔽數據庫密碼的目的是什么。 如果一切都可以在幾秒鍾內解開。 這對我來說似乎很弱的安全性。 請告訴我如何使它比現在更安全。

“如果你使用消息消化技術加密它,......你不能。”

這是不幸的表述。 您可以加密數據(可逆)或散列(不可逆)。

其實SO上有很多這樣的問題,搜索一下就可以了。 如果你有一個服務的秘密(例如數據庫憑證、API 密鑰),你可以加密它們,但你也需要在某處擁有密鑰。

好吧,您可以通過環境變量傳遞密碼(“pass”)

這是從代碼中分離秘密的最簡單方法。 您應該決定什么是威脅、您想要防范什么以及如何防范。 如果您限制了源代碼泄露機密的可能性,使用環境變量或部署參數可能會有所幫助。

此外,在 Gitlab 或 Kubernetes 等系統上提供環境變量等實際密碼對我來說似乎風險很大。

如果有人可以訪問您的計算機,那將不再是您的計算機。 使用 kubernetes secrets 或 Ansible vault、pipeline 參數……它可以幫助從代碼庫中分離秘密。

黑客,如果他非常先進,也可以讀取這些值。

如果有人可以冒充您或應用程序,您將無能為力。 這就是為什么您需要阻止它(最低權限,所有層的安全性,..)

我的問題是你能不能以某種方式禁用 Jasypt 解密,以便不取回實際價值,這樣黑客也不能得到它?

.. 然后您的應用程序也不會取回它,並且該應用程序將無法訪問數據庫或其他服務。

有一些選項可以通過不同的方式進行身份驗證(例如 Kerberos),但我個人盡量避免使用它,因為配置和排除故障並不簡單。 然后我們保留存儲在環境或部署管道中某處的密碼和密鑰。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM