예제 #1
0
파일: KeyHelper.cs 프로젝트: bhbk/fm3na7zy
        public static tbl_PrivateKey CreatePrivKey(IConfiguration conf, IUnitOfWork uow, tbl_User user,
                                                   SshHostKeyAlgorithm keyAlgo, int privKeySize, string privKeyPass, SignatureHashAlgorithm sigAlgo, string comment)
        {
            var callPath   = $"{MethodBase.GetCurrentMethod().DeclaringType.Name}.{MethodBase.GetCurrentMethod().Name}";
            var privId     = Guid.NewGuid();
            var pubId      = Guid.NewGuid();
            var privStream = new MemoryStream();
            var pubStream  = new MemoryStream();
            var keyPair    = SshPrivateKey.Generate(keyAlgo, privKeySize);

            keyPair.Save(privStream, privKeyPass, SshPrivateKeyFormat.Pkcs8);
            keyPair.SavePublicKey(pubStream, SshPublicKeyFormat.Pkcs8);

            var privKey = uow.PrivateKeys.Create(
                new tbl_PrivateKey
            {
                Id          = privId,
                PublicKeyId = pubId,
                IdentityId  = user.IdentityId,
                KeyValue    = Encoding.ASCII.GetString(privStream.ToArray()),
                KeyAlgo     = keyPair.KeyAlgorithm.ToString(),
                KeyPass     = AES.EncryptString(privKeyPass, conf["Databases:AuroraSecret"]),
                KeyFormat   = SshPrivateKeyFormat.Pkcs8.ToString(),
                Enabled     = true,
                Deletable   = true,
                Created     = DateTime.Now,
                LastUpdated = null,
            });

            Log.Information($"'{callPath}' '{user.IdentityAlias}' private key algo {keyPair.KeyAlgorithm} sig {keyPair.Fingerprint.ToString(sigAlgo, false)}" +
                            $"{Environment.NewLine}{privKey.KeyValue}");

            var pubKey = uow.PublicKeys.Create(
                new tbl_PublicKey
            {
                Id           = pubId,
                PrivateKeyId = privId,
                IdentityId   = user.IdentityId,
                KeyValue     = Encoding.ASCII.GetString(pubStream.ToArray()),
                KeyAlgo      = keyPair.KeyAlgorithm.ToString(),
                KeyFormat    = SshPublicKeyFormat.Pkcs8.ToString(),
                SigValue     = keyPair.Fingerprint.ToString(sigAlgo, false),
                SigAlgo      = sigAlgo.ToString(),
                Comment      = comment,
                Enabled      = true,
                Deletable    = true,
                Created      = DateTime.Now,
                LastUpdated  = null,
            });

            Log.Information($"'{callPath}' '{user.IdentityAlias}' public key algo {keyPair.KeyAlgorithm} sig {keyPair.Fingerprint.ToString(sigAlgo, false)}" +
                            $"{Environment.NewLine}{pubKey.KeyValue}");

            uow.Commit();

            return(privKey);
        }
예제 #2
0
파일: KeyHelper.cs 프로젝트: bhbk/fm3na7zy
        public static void CheckPrivKey(IConfiguration conf, IUnitOfWork uow,
                                        SshHostKeyAlgorithm keyAlgo, int privKeySize, string privKeyPass, SignatureHashAlgorithm sigAlgo)
        {
            var keyAlgoStr = keyAlgo.ToString();
            var privKey    = uow.PrivateKeys.Get(QueryExpressionFactory.GetQueryExpression <tbl_PrivateKey>()
                                                 .Where(x => x.KeyAlgo == keyAlgoStr && x.IdentityId == null && x.Deletable == false).ToLambda())
                             .SingleOrDefault();

            if (privKey == null)
            {
                CreatePrivKey(conf, uow, keyAlgo, privKeySize, privKeyPass, sigAlgo);
            }
        }