linux版本中间件

TokenList.cpp 3.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. #include "TokenList.h"
  2. #include <iostream>
  3. #include <cryptopp/aes.h>
  4. #include <cryptopp/filters.h>
  5. #include <cryptopp/modes.h>
  6. #include <cryptopp/base64.h>
  7. #include <cryptopp/hex.h>
  8. #include "Config.h"
  9. #define TIME_OUT 60
  10. #define TIME_EXPIRE 120
  11. bool TokenList::Auth(const std::int64_t &llConID, const std::string &strData)
  12. {
  13. std::int64_t llsubTime = 0;
  14. std::string strMark;
  15. if (!decry_data(strData, llsubTime, strMark)) {
  16. return false;
  17. }
  18. if (llsubTime > TIME_OUT || llsubTime < -TIME_OUT) {
  19. std::cout << "验证失败,超时 "<<llsubTime << std::endl;
  20. return false;
  21. }
  22. std::unique_lock<std::shared_mutex>lock(mut);
  23. /*for (auto it = this->begin(); it != this->end(); ) {
  24. decry_data(strData, llsubTime, strMark);
  25. if (llsubTime > TIME_EXPIRE) {
  26. it = this->erase(it);
  27. }
  28. else {
  29. ++it;
  30. }
  31. }*/
  32. for (auto it = this->begin();it!=this->end();++it) {
  33. if (it->second == strData) {
  34. std::cout << "Token验证失败,该Token已被使用" << std::endl;
  35. return false;
  36. }
  37. }
  38. this->erase(llConID);
  39. this->insert(std::pair<std::int64_t, std::string>(llConID, strData));
  40. return true;
  41. }
  42. bool TokenList::exists(const std::int64_t & llConID)
  43. {
  44. std::unique_lock<std::shared_mutex>lock(mut);
  45. auto it = this->find(llConID);
  46. if (it != this->end()) {
  47. return true;
  48. }
  49. return false;
  50. }
  51. void TokenList::remove(const std::int64_t & llConID)
  52. {
  53. std::unique_lock<std::shared_mutex>lock(mut);
  54. auto it = this->find(llConID);
  55. if (it != this->end()) {
  56. this->erase(it);
  57. }
  58. }
  59. bool TokenList::decry_data(const std::string & strData, std::int64_t & llsubTime, std::string & strMark)
  60. {
  61. auto cfg = CConfig::GetInstance();
  62. auto key = cfg->aesKey();
  63. auto mark = cfg->aesMark();
  64. //unsigned char *ptr = reinterpret_cast<unsigned char*>(const_cast<char*>(key.data()));
  65. //auto src = aes_decrypt_ecb_base64(strData, ptr, key.length());
  66. auto src = aes_decrypt_ecb_base64(strData, (std::uint8_t*)key.data(), key.length());
  67. if (src.length() != (13 + mark.length())) { // 前端发送的至少13位的时间戳
  68. std::cout << "验证失败,Token不合法" << std::endl;
  69. return false;
  70. }
  71. auto strTime = src.substr(0, 10);// 获取到秒的时间戳
  72. llsubTime = time(0) - atoi(strTime.c_str());
  73. strMark = src.substr(13, src.length() - 13);
  74. if (strMark != mark) {
  75. std::cout << "验证失败,Token标识不合法" << std::endl;
  76. return false;
  77. }
  78. return true;
  79. }
  80. std::string TokenList::aes_encrypt_ecb_base64(std::string data, unsigned char * key, int keylen)
  81. {
  82. std::string encrypt_str;
  83. try
  84. {
  85. CryptoPP::ECB_Mode<CryptoPP::AES>::Encryption ecb_encription(key, keylen);
  86. CryptoPP::StreamTransformationFilter stf_encription(
  87. ecb_encription,
  88. new CryptoPP::Base64Encoder(new CryptoPP::StringSink(encrypt_str)),
  89. CryptoPP::BlockPaddingSchemeDef::DEFAULT_PADDING
  90. );
  91. stf_encription.Put(reinterpret_cast<const unsigned char*>(data.c_str()), data.length());
  92. stf_encription.MessageEnd();
  93. }
  94. catch (std::exception e) {
  95. std::cout << e.what() << std::endl;
  96. }
  97. return encrypt_str;
  98. }
  99. std::string TokenList::aes_decrypt_ecb_base64(std::string base64_data, unsigned char * key, int keylen)
  100. {
  101. try
  102. {
  103. std::string aes_encrypt_data;
  104. CryptoPP::Base64Decoder decoder;
  105. decoder.Attach(new CryptoPP::StringSink(aes_encrypt_data));
  106. decoder.Put(reinterpret_cast<const unsigned char*>(base64_data.c_str()), base64_data.length());
  107. decoder.MessageEnd();
  108. std::string decrypt_data;
  109. CryptoPP::ECB_Mode<CryptoPP::AES>::Decryption ebc_description(key, keylen);
  110. CryptoPP::StreamTransformationFilter stf_description(
  111. ebc_description,
  112. new CryptoPP::StringSink(decrypt_data),
  113. CryptoPP::BlockPaddingSchemeDef::DEFAULT_PADDING
  114. );
  115. stf_description.Put(
  116. reinterpret_cast<const unsigned char*>(aes_encrypt_data.c_str()),
  117. aes_encrypt_data.length()
  118. );
  119. stf_description.MessageEnd();
  120. return decrypt_data;
  121. }
  122. catch (std::exception e) {
  123. std::cout << e.what() << std::endl;
  124. return "";
  125. }
  126. }