svn手动加密/缓存用户密码

时间:2019-01-29 14:18:33

标签: svn tortoisesvn

目标:在命令提示符下运行svn命令时,避免使用svn身份验证提示。

我知道有一个选项可以将--username&--password传递给svn命令。但是我不想这样做,因为svn操作是从批处理脚本完成的,并且我不想在批处理脚本中存储密码。

如果我们创建文件,该文件需要存在于%APPDATA%\ Subversion \ auth \ svn.simple \下,并更新其内容。它是否转义身份验证提示。可以这样做吗?

我看到有工具可以从svn.simple下的文件中解密密码。但是,如何加密密码并创建具有正确哈希名称的文件,以便svn使用它?

1 个答案:

答案 0 :(得分:1)

找到解决方案。以下是Windows中加密的颠覆过程。

  1. Subversion使用Windows的CryptProtectData函数对密码进行加密。
  2. Subversion对加密密码进行base64编码,并将其保存到%APPDATA%\ Subversion \ auth \ svn.simple \

尝试使用Powershell:

无法通过Powershell自动化,原因是CryptProtectData使用了“描述”参数,该参数包含在加密密码中。但是Powershell ProtectedData函数不使用“描述”参数。

结果,如果我使用Powershell“ ProtectedData”,则与通过Subversion进行加密相比,加密数据的大小较小。

解决方案:

因此,我使用c ++代码对来自颠覆源代码的完全相同的“描述”字符串执行了完全相同的操作,以对密码进行加密,并对加密的数据进行了base64编码,并且可以正常工作。

# Below piece is taken from svn source code - file name: subversion/libsvn_subr/win32_crypto.c
CryptProtectData(
     &blobin, // Input Data BLOB
     L"auth_svn.simple.wincrypt",  // Description String
     NULL, NULL, NULL,                       
     CRYPTPROTECT_UI_FORBIDDEN,    // Constant to avoid prompting user
     &blobout                      // Output Data BLOB
 )

注意:我将在不久的将来尝试共享代码。

其他提示

CryptProtectData函数创建一个会话密钥来执行加密。当要解密数据时,会再次导出会话密钥(关于确切的密钥及其存储方式等,我没有进一步介绍)。因此,我们必须使用计划执行svn操作的用户帐户来执行加密。

如前所述,SVN将详细信息缓存在%APPDATA%\ Subversion \ auth \ svn.simple \下,文件名为“ svn:realmstring的MD5哈希值”。

# you can find the svn realm string, if you have already cached in the your account
# Up to my observations it is <svn url> <standard text>
<https://testsvn.svn.com:443>  SVN AD-LDAP login (username, lowercase with domain)