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

Security Maven 3密码加密是如何工作的?,security,maven,encryption,passwords,Security,Maven,Encryption,Passwords,我试图理解Maven 3的[密码加密]功能。我发现该功能的文档记录不完整,令人困惑。例如,该功能在几点上相互矛盾 这一问题的范围比其他问题更广,不在本报告的涵盖范围之内 具体来说,我试图回答以下文档中未涉及的问题。我已将迄今为止收集到的信息以斜体显示在每个问题下方 加密的主密码是否仅通过存在于只有一个用户可以访问的文件夹(~/.m2)中的settings security.xml提供安全性?如果是这样,为什么要麻烦加密“主密码”(为什么不使用一些随机值)?难道“主密码”真的只是加密函数的熵输入吗

我试图理解Maven 3的[密码加密]功能。我发现该功能的文档记录不完整,令人困惑。例如,该功能在几点上相互矛盾

这一问题的范围比其他问题更广,不在本报告的涵盖范围之内

具体来说,我试图回答以下文档中未涉及的问题。我已将迄今为止收集到的信息以斜体显示在每个问题下方

  • 加密的主密码是否仅通过存在于只有一个用户可以访问的文件夹(
    ~/.m2
    )中的
    settings security.xml
    提供安全性?如果是这样,为什么要麻烦加密“主密码”(为什么不使用一些随机值)?难道“主密码”真的只是加密函数的熵输入吗?称之为密码令人困惑-我希望Maven在解密任何加密的服务器密码之前提示我输入此密码,但它没有
  • 我的理解是,是的,这只能通过存在于操作系统保护的文件中来提供安全性。我相信Maven允许您加密主密码,这样,如果您丢失
    settings security.xml
    文件,您就可以重新生成它。这是否正确

  • 主密码和服务器密码是否使用相同的加密过程/密码?服务器密码基于主密码,因此算法中一定存在一些差异。此密码的源代码位于何处
  • 链接到。不清楚这是密码还是提供密码功能的实际Maven插件

  • 我注意到同一个主密码或多次加密的服务器密码会给出不同的哈希值在加密之前,密码中添加了“64位随机salt”。Maven在编译时使用存储的密码时对其进行解密。这难道不意味着这些salt必须存储在某个地方吗
  • 我不知道

  • 我还观察到,如果主密码被重新加密并存储在
    设置security.xml
    文件中,即使加密的主密码密文现在不同了,使用一个加密的主密码加密的常规密码仍然有效。有人能解释一下这是如何工作的吗
  • 我不知道。在我看来,Maven好像在做一些可疑的事情,或者在某处存储明文

  • 我的理解是,加密密码只能与
    设置.xml
    文件中的
    标记一起使用。这是真的吗?哪里可以使用
    设置.xml
    中定义的服务器
  • 我的理解是
    定义可以在
    中使用,但不能在
    中使用。有人能验证一下吗

  • 对于这样一个关键特性(构建系统安全性),我觉得有很多混乱和糟糕的文档。有人能指出Maven 3网站上的文档是如何工作的吗?是否有wiki链接可以让我尝试改进文档
  • 我不知道


    对不起,这里有这么多文字,谢谢你的回答。

    我的回答是基于阅读Maven源代码和做一些研究

  • 加密的主密码是否仅通过存在于只有一个用户可以访问的文件夹中的
    settings security.xml
    来提供安全性 访问(
    ~/.m2
    )?如果是这样的话,为什么还要费心加密“主机” 密码(为什么不使用一些随机值)?“主”不是吗 密码“真的只是加密函数的熵输入吗? 称它为密码是令人困惑的——我希望Maven会提示我输入密码 在对任何加密的服务器密码进行解密之前,请输入此密码,但是 事实并非如此
  • 主密码是加密功能的输入,用于加密/解密服务器密码。如果有人拥有您的个人加密服务器密码,则除非他们也拥有您的主密码,否则他们将无法解密。这意味着您可以与其他人自由共享您的maven settings.xml文件,而不需要abl这也是主密码保存在单独文件中的原因

    这一基本原理在本文中有所解释

  • 主密码和服务器密码是否使用相同的加密过程/密码?服务器密码基于主密码, 所以算法上肯定有一些不同。来源在哪里 这个的代码在哪里
  • 据我所知,主密码使用与服务器密码相同的密码进行加密。解密服务器密码时,主密码(未加密形式)是一个输入;解密主密码时,魔术字符串“settings.security”用作附加输入

    您可以查看源代码和

  • 我观察到,同一主密码或多次加密的服务器密码会给出不同的哈希值 JVM配置特定(通常为SHA1PRNG)64位随机盐是 加密前添加到密码。Maven解密存储的 在编译时使用密码。这不是意味着 盐必须储存在什么地方
  • 处理盐的传统方法是随机盐与加密文本一起存储。请参阅

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

  • 我还观察到,如果主密码是安全的,则使用一个加密主密码加密的常规密码仍然有效 重新加密并存储在
    设置security.xml
    文件中,偶数 通过加密主机
    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>
    
    sha = sha256( X + salt[8] )
    key = sha[0..16]
    iv  = sha[16..32]
    
    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);
        }
    }