Implement service-generated authorization capability
This commit is contained in:
117
server/2015Remote/pwd_gen.cpp
Normal file
117
server/2015Remote/pwd_gen.cpp
Normal file
@@ -0,0 +1,117 @@
|
||||
#include "stdafx.h"
|
||||
#include "pwd_gen.h"
|
||||
|
||||
#pragma comment(lib, "Advapi32.lib")
|
||||
|
||||
// ִ<><D6B4>ϵͳ<CFB5><CDB3><EFBFBD><EFBFBD><EEA3AC>ȡӲ<C8A1><D3B2><EFBFBD><EFBFBD>Ϣ
|
||||
std::string execCommand(const char* cmd) {
|
||||
// <20><><EFBFBD>ùܵ<C3B9><DCB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
SECURITY_ATTRIBUTES saAttr;
|
||||
saAttr.nLength = sizeof(SECURITY_ATTRIBUTES);
|
||||
saAttr.bInheritHandle = TRUE;
|
||||
saAttr.lpSecurityDescriptor = NULL;
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڽ<EFBFBD><DABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĺܵ<C4B9>
|
||||
HANDLE hStdOutRead, hStdOutWrite;
|
||||
if (!CreatePipe(&hStdOutRead, &hStdOutWrite, &saAttr, 0)) {
|
||||
Mprintf("CreatePipe failed with error: %d\n", GetLastError());
|
||||
return "ERROR";
|
||||
}
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
|
||||
STARTUPINFO si = { sizeof(si) };
|
||||
PROCESS_INFORMATION pi;
|
||||
|
||||
// <20><><EFBFBD>ô<EFBFBD><C3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
|
||||
si.wShowWindow = SW_HIDE;
|
||||
si.hStdOutput = hStdOutWrite; // <20><><EFBFBD><EFBFBD><EFBFBD><D7BC><EFBFBD><EFBFBD><EFBFBD>ض<EFBFBD><D8B6>ܵ<F2B5BDB9>
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
if (!CreateProcess(
|
||||
NULL, // Ӧ<>ó<EFBFBD><C3B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
(LPSTR)cmd, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
NULL, // <20><><EFBFBD>̰<EFBFBD>ȫ<EFBFBD><C8AB><EFBFBD><EFBFBD>
|
||||
NULL, // <20>̰߳<DFB3>ȫ<EFBFBD><C8AB><EFBFBD><EFBFBD>
|
||||
TRUE, // <20>Ƿ<EFBFBD><C7B7>̳о<CCB3><D0BE><EFBFBD>
|
||||
0, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־
|
||||
NULL, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
NULL, // <20><>ǰĿ¼
|
||||
&si, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
|
||||
&pi // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
|
||||
)) {
|
||||
Mprintf("CreateProcess failed with error: %d\n", GetLastError());
|
||||
return "ERROR";
|
||||
}
|
||||
|
||||
// <20>ر<EFBFBD>д<EFBFBD><D0B4><EFBFBD>˾<EFBFBD><CBBE><EFBFBD>
|
||||
CloseHandle(hStdOutWrite);
|
||||
|
||||
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
char buffer[128];
|
||||
std::string result = "";
|
||||
DWORD bytesRead;
|
||||
while (ReadFile(hStdOutRead, buffer, sizeof(buffer), &bytesRead, NULL) && bytesRead > 0) {
|
||||
result.append(buffer, bytesRead);
|
||||
}
|
||||
|
||||
// <20>رն<D8B1>ȡ<EFBFBD>˾<EFBFBD><CBBE><EFBFBD>
|
||||
CloseHandle(hStdOutRead);
|
||||
|
||||
// <20>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
WaitForSingleObject(pi.hProcess, INFINITE);
|
||||
|
||||
// <20>رս<D8B1><D5BD>̺<EFBFBD><CCBA>߳̾<DFB3><CCBE><EFBFBD>
|
||||
CloseHandle(pi.hProcess);
|
||||
CloseHandle(pi.hThread);
|
||||
|
||||
// ȥ<><C8A5><EFBFBD><EFBFBD><EFBFBD>з<EFBFBD><D0B7>Ϳո<CDBF>
|
||||
result.erase(remove(result.begin(), result.end(), '\n'), result.end());
|
||||
result.erase(remove(result.begin(), result.end(), '\r'), result.end());
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
return result;
|
||||
}
|
||||
|
||||
// <20><>ȡӲ<C8A1><D3B2> ID<49><44>CPU + <20><><EFBFBD><EFBFBD> + Ӳ<>̣<EFBFBD>
|
||||
std::string getHardwareID() {
|
||||
std::string cpuID = execCommand("wmic cpu get processorid");
|
||||
std::string boardID = execCommand("wmic baseboard get serialnumber");
|
||||
std::string diskID = execCommand("wmic diskdrive get serialnumber");
|
||||
|
||||
std::string combinedID = cpuID + "|" + boardID + "|" + diskID;
|
||||
return combinedID;
|
||||
}
|
||||
|
||||
// ʹ<><CAB9> SHA-256 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϣ
|
||||
std::string hashSHA256(const std::string& data) {
|
||||
HCRYPTPROV hProv;
|
||||
HCRYPTHASH hHash;
|
||||
BYTE hash[32];
|
||||
DWORD hashLen = 32;
|
||||
std::ostringstream result;
|
||||
|
||||
if (CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_AES, CRYPT_VERIFYCONTEXT) &&
|
||||
CryptCreateHash(hProv, CALG_SHA_256, 0, 0, &hHash)) {
|
||||
|
||||
CryptHashData(hHash, (BYTE*)data.c_str(), data.length(), 0);
|
||||
CryptGetHashParam(hHash, HP_HASHVAL, hash, &hashLen, 0);
|
||||
|
||||
for (DWORD i = 0; i < hashLen; i++) {
|
||||
result << std::hex << std::setw(2) << std::setfill('0') << (int)hash[i];
|
||||
}
|
||||
|
||||
CryptDestroyHash(hHash);
|
||||
CryptReleaseContext(hProv, 0);
|
||||
}
|
||||
return result.str();
|
||||
}
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> 16 <20>ַ<EFBFBD><D6B7><EFBFBD>Ψһ<CEA8>豸 ID
|
||||
std::string getFixedLengthID(const std::string& hash) {
|
||||
return hash.substr(0, 4) + "-" + hash.substr(4, 4) + "-" + hash.substr(8, 4) + "-" + hash.substr(12, 4);
|
||||
}
|
||||
|
||||
std::string deriveKey(const std::string& password, const std::string& hardwareID) {
|
||||
return hashSHA256(password + " + " + hardwareID);
|
||||
}
|
||||
Reference in New Issue
Block a user