none
关于system用户下的不对称加密的诡异问题. RRS feed

  • 问题

  • Imports System.Security.Cryptography
    
    
    
    Module Module1
    
    
    
      Sub Main(ByVal args() As String)
    
    
    
      console.writeline(GetPw(args(0)))
    
    
    
     End Sub
    
    
    
     Private Function GetPw(ByVal CryptoPw As String) As String
    
    
    
      Dim RSAPublic As String = String.Empty
    
      Dim CspContainerName As String = "TEST" 
    
      Dim CspPara As New CspParameters
    
      GetPw = String.Empty
    
    
    
      Try
    
    
    
       CspPara.KeyContainerName = CspContainerName
    
       Dim RSA As New RSACryptoServiceProvider(CspPara)
    
       RSA.PersistKeyInCsp = True
    
    
    
       Dim DecPWD() As Byte
    
    
    
       Dim en() As Byte
    
    
    
       en = Convert.FromBase64String(CryptoPw)
    
    
    
       DecPWD = RSA.Decrypt(en, False)
    
    
    
       GetPw = System.Text.Encoding.Default.GetString(DecPWD)
    
    
    
      Catch ex As Exception
    
    
    
       MsgBox(ex.Message)
    
    
    
      End Try
    
    
    
     End Function
    
    
    
    End Module
    
    
    
    

    写了以上的一个程序,getPw 要求输入一个base64的string作为加密后的密码密文,输出密码明文,在正常使用时一切良好,正常解密,没有任何问题.

    但是当把这个过程以system用户运行时(原程序是做成系统服务以system用户运行的)就出现莫名奇妙的字符丢失问题,比如原始密码是:^^&&**,但是用getPw来解密后却只剩下一个 ^字符,发现只要密码明文中包含%&^等类似特殊字符,解密后大多数会出问题.同样的过程,以administrator用户运行,使用同样的密码明文加密,然后解密,没有任何问题.

    现在发现了这个问题,但是不知道具体什么规则?或者有什么办法解决这个问题呢?因为程序就是为了保护密码明文才使用不对称加密的方法的,如果密码没法使用特殊字符的话,安全性方面就减弱了.

     

    2010年6月5日 11:27

答案

  • 服务进程里面基于用户的配置文件的东西都不能用,因为服务里面没有每用户的配置。

    你可以为服务指定一个单独的用户名,然后调用LoadUserProfile



    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful, so they will appear differently to other users who are visiting your thread for the same problem.
    Visual C++ MVP
    • 已标记为答案 Kira Qian 2010年6月15日 5:42
    2010年6月5日 12:48
    版主