当前位置: 首页 > 知识库问答 >
问题:

Maven 3密码加密是如何工作的?

罗业
2023-03-14

我试图理解Maven 3的[password encryption(密码加密)功能。我发现这个功能的文档记录很差,令人困惑。例如,功能文档和该功能作者的博客文章在几个方面相互矛盾。

这个问题比maven-encrypt master password如何工作更广泛,maven encrypt master password选择密码的良好实践没有涵盖。

具体来说,我试图回答以下文件中未涉及的问题。我把迄今为止收集到的信息用斜体字写在每个问题下面。

  1. 加密的主密码是否仅通过存在于设置安全中来提供安全性。只有一个用户可以访问的文件夹中的xml(~/.m2)?如果是这样,为什么要费心加密“主密码”(为什么不只是使用一些随机值)?“主密码”真的只是加密函数的熵输入吗?把它称为密码让人困惑——我本以为Maven会在对任何加密的服务器密码进行解密之前提示我输入这个密码,但事实并非如此

我的理解是,是的,这只能通过存在于操作系统保护的文件中来提供安全性。我相信Maven允许您加密主密码,这样如果您失去了设置安全性。xml文件,您可以重新生成它。这是正确的吗?

马塞洛·莫拉莱斯关于maven-加密-主-密码如何工作的回答链接到GitHub上的plexus-cihper项目。尚不清楚这只是密码,还是提供密码功能的实际Maven插件。

我不知道。

我不知道。在我看来,Maven正在做一些可疑的事情,或者在某个地方存储明文。

我的理解是<代码>

我完全不知道

抱歉的文字墙,并感谢任何答案。


共有3个答案

贺雪松
2023-03-14

下面是示例代码,展示了如何从中解密maven主密码

<代码>~/。m2/安全设置。xml

以及来自的服务器密码

~/. m2/settings.xml

MavenPasswordDecryptor.java

import org.sonatype.plexus.components.cipher.DefaultPlexusCipher;

public class MavenPasswordDecryptor {
    public static void main(String[] args) throws Exception {

        if (args.length < 1 || args.length > 2 ) {
            System.out.println("Usage: java -jar maven-password-decryptor.jar <encrypted-password>");
            System.out.println("Usage: java -jar maven-password-decryptor.jar <encrypted-password> <master-password>");
            return;
        }

        DefaultPlexusCipher cipher = new DefaultPlexusCipher();

        String encryptedPassword = args[0];
        String passPhrase = (args.length == 2 && args[1] != null && !args[1].isEmpty()) ? args[1] : "settings.security";

        String result = cipher.decryptDecorated(encryptedPassword, passPhrase);

        System.out.println(result);
    }
}

GitHub上还有一个示例项目:

https://github.com/uweguenther/maven-password-decryptor

燕元明
2023-03-14

我需要知道bnd(工具)的这一点,以便我可以分享一些更深入的分析。

“加密”密码的语法为:

output    ::= '{' base64(packet) '}'
packet    ::= salt[8] padlen[1] encrypted[?] padding[padlen]
salt      ::= <random>
padlen    ::= <length of padding >
padding   ::= <random to make packet length a multiple of 16>

使用的密码是AES/CBC/PKCS5P。密钥和初始化向量计算如下:

sha = sha256( X + salt[8] )
key = sha[0..16]
iv  = sha[16..32]

对于主密码,X是“安全设置”。由于这是一个众所周知的常数,主密码不加密,只会被隐藏。对于服务器密码,X是解码的主密码。

为什么对生成的数据包进行填充似乎是浪费字节,因为数据包格式使得剥离变得微不足道,而且它们从来都不是加密/解密的一部分。它们只是在base64字符串中添加一些随机字符。

唯一有用的方法是使用搬迁设施。例如,如果您安装了设置安全性。构建服务器上私有装载上的xml。然后,您可以自由共享设置。公共回购中的xml文件。然而,这也是一个糟糕的解决方案,因为您需要为所有用户和CI构建服务器装载相同的装载点。

请注意,任何插件都可以解码您的所有服务器密码,因此永远不要为服务器使用真实密码。Nexus可以创建代理密码。

茅星雨
2023-03-14

我的答案是基于阅读Maven源代码并做一些研究。

  1. 加密的主密码是否仅通过存在于设置安全中来提供安全性。只有一个用户可以访问的文件夹中的xml~/.m2)?如果是这样,为什么要费心加密“主密码”(为什么不只是使用一些随机值)?“主密码”真的只是加密函数的熵输入吗?把它称为密码让人困惑——我本以为Maven会在对任何加密的服务器密码进行解密之前提示我输入这个密码,但事实并非如此

主密码是加密/解密服务器密码的加密功能的输入。如果有人拥有您的个人加密服务器密码,除非他们也拥有您的主密码,否则他们将无法解密它们。这意味着您可以自由地与他人共享您的mavensettings.xml文件,而他们无法解密您的服务器密码。这也是主密码保存在单独文件中的原因。

加密指南中对这一原理进行了一定程度的解释

据我所知,主密码使用与服务器密码相同的密码进行加密。解密服务器密码时,主密码(未加密形式)是一个输入;解密主密码时,魔术字符串“settings.security”用作附加输入。

您可以看到源代码PBECipher和MavenCli。Java语言

处理盐类的传统方法是,随机盐类与加密文本一起存储。请参阅维基百科的文章。

根据上面链接的源代码,盐似乎存储为Base64解码字节的前8个字节,就在加密密码之前。

这是因为使用的是主密码的解密形式,而不是加密的“密文”。因此重新加密不会影响服务器密码加密/解密。

我不知道你最后两个(5和6)问题的答案。

 类似资料:
  • 我正在使用JMX远程监控我的服务器。但是,jmx-access和jmx密码存储我不想要的清除密码。 接下来是如何为JConsole的密码文件加密密码,如何使JMX自定义身份验证工作?以及如何创建登录模块?,我编写了一个自定义登录模块。 我的登录模块: 这是我的登录模块配置文件(d:/mysecurity.cfg): 启动服务器时,我使用以下参数: 然而,当我试图用JCsonle连接服务器时,我无法

  • 我试图完全理解密码散列,以便能够向审计员解释它。 基于我对答案的搜索,我知道函数是的包装器。在阅读预定义常量的PHP手册时,我看到它使用作为默认整数值(基本上它使用算法来散列密码)。 让我困惑的是,变量如果省略,会生成一个随机salt,并且成本将设置为。如果我提供了更高的成本(例如:),由于我没有提供salt值,它还会生成随机salt吗?我在这里感到困惑的原因是,我没有忽略,而是提供了不同的成本。

  • 我认为我理解散列和加盐密码,但似乎我有一些误解。我在nodejs为我的网站创建一个用户帐户系统。 我的理解是,当用户创建密码时,我们会生成一个随机盐,将其附加到密码中,然后散列该字符串。我们还可以添加一个工作因子以使散列工作缓慢并防御蛮力攻击。我们将盐与散列一起存储在我们的数据库中,为了验证登录尝试,我们使用存储的盐和尝试的密码重复上述过程(在服务器上),并检查散列是否匹配。 nodejs中的模块

  • 问题内容: 我正在使用JConsole访问我的应用程序MBean,并且使用了password.properties文件。但是根据Sun的规范,此文件仅包含明文格式的密码。 现在,我想对密码进行加密并将其用于JConsole的JMX用户身份验证(“远程”部分中的“用户名”和“密码”字段)。我可以使用任何预定义的加密逻辑或自己的加密算法。 是否有人知道将这种纯文本密码更改为加密密码,这样JMX Fra

  • 问题内容: 我已经以加密格式将用户密码存储在数据库中。但是,现在,当用户想要登录并尝试输入其原始密码时,该代码始终会将输入的(原始)密码与数据库中存储的加密版本进行比较,从而导致登录失败。 请告诉我如何比较输入的(原始)密码和存储在数据库中的加密密码。 问题答案: 几乎可以肯定,您应该对密码进行 哈希处理 ,而不是使用可逆加密。您可能还需要 用盐 来做…在这种情况下,正确的步骤是: 查找最初对密码

  • 在FTPS中,密码在尝试通过internet连接服务器时被加密。这就是我所理解的,如果我的理解有任何遗漏,请更正。我的问题是,当我厌倦了模拟它(FTPs和FTP)时,我只是得到一条消息,说SSL已经建立(以及基于隐式和显式调用的端口更改)。 是否有任何其他方式来确认密码是真正加密的,或者我们可以看到密码时,它的普通FTP。下面是我在服务器端看到的日志 启用FTP时的服务器日志- 状态:TLS/SS