UE4中Crypto++库加密解密

第三节:UE4中实现PBKDF2加密验证


文章目录

  • UE4中Crypto++库加密解密
  • 前言
  • 代码
    • 1. C++代码
    • 2. 蓝图
  • 测试结果
  • 参考

前言

通过哈希算法进行加密。因为哈希算法是单向的,可以将任何大小的数据转化为定长的“指纹”,而且无法被反向计算。另外,即使数据源只改动了一丁点,哈希的结果也会完全不同。这样的特性使得它非常适合用于保存密码,因为我们需要加密后的密码无法被解密,同时也能保证正确校验每个用户的密码。但是哈希加密可以通过字典攻击和暴力攻击破解。
密码加盐。盐是一个添加到用户的密码哈希过程中的一段随机序列。这个机制能够防止通过预先计算结果的彩虹表破解。每个用户都有自己的盐,这样的结果就是即使用户的密码相同,通过加盐后哈希值也将不同。为了校验密码是否正确,我们需要储存盐值。通常和密码哈希值一起存放在账户数据库中,或者直接存为哈希字符串的一部分。


提示:以下是本篇文章正文内容,下面案例可供参考

代码

首先要生成一个盐值salt,再把原始密码和salt加密得到密文。验证的时候,把用户输入的密码和同样的盐值salt使用相同的加密算法得到一个密文,将这个密文和原密文相比较,相同则验证通过,反之则不通过。
以下为实现逻辑:

1. C++代码

MyPBKDF2.h

#pragma once#include "CoreMinimal.h"#include "../ThirdParty/crypto/include/Win64/config_int.h"
#include "../ThirdParty/crypto/include/Win64/pwdbased.h"
#include "../ThirdParty/crypto/include/Win64/sha.h"
#include "../ThirdParty/crypto/include/Win64/hex.h"
#include "../ThirdParty/crypto/include/Win64/cryptlib.h"
#include "../ThirdParty/crypto/include/Win64/blake2.h"
#include "../ThirdParty/crypto/include/Win64/files.h"
#include "../ThirdParty/crypto/include/Win64/aes.h"
#include "../ThirdParty/crypto/include/Win64/modes.h"
#include "../ThirdParty/crypto/include/Win64/pubkey.h"
using namespace CryptoPP;#include "Kismet/BlueprintFunctionLibrary.h"
#include "MyPBKDF2.generated.h"/*** */
UCLASS()
class TEST_API UMyPBKDF2 : public UBlueprintFunctionLibrary
{GENERATED_BODY()
public://PBKDF2算法//验证密码UFUNCTION(BlueprintCallable, meta = (DisplayName = "authenticate", Keywords = "authenticate", pbkdf2_key = "0123456789ABCDEF0123456789ABCDEF"), Category = "PBKDF2")static bool authenticate(FString attemptedPassword, FString encryptedPassword, FString pbkdf2_key);//生成密文UFUNCTION(BlueprintCallable, meta = (DisplayName = "getEncryptedPassword", Keywords = "getEncryptedPassword", pbkdf2_key = "0123456789ABCDEF0123456789ABCDEF"), Category= "PBKDF2")static  FString getEncryptedPassword(FString pbkdf2_content, FString pbkdf2_key);};

MyPBKDF2.cpp

include "MyPBKDF2.h"
/**
* 对输入的password进行验证
*
* @param attemptedPassword
*            待验证的password
* @param encryptedPassword
*            密文
* @param salt
*            盐值
* @return 是否验证成功
*/
#pragma region PBKDF2
bool UMyPBKDF2::authenticate(FString attemptedPassword, FString encryptedPassword, FString salt)
{// 用同样的盐值对用户输入的password进行加密FString encryptedAttemptedPassword = getEncryptedPassword(attemptedPassword, salt);// 把加密后的密文和原密文进行比較,同样则验证成功。否则失败return encryptedAttemptedPassword.Equals(encryptedPassword);
}/**
* 生成密文
*
* @param password
*            明文password
* @param salt
*            盐值
* @return
*/
FString UMyPBKDF2::getEncryptedPassword(FString pbkdf2_content, FString pbkdf2_key)
{std::string _pbkdf2_content = TCHAR_TO_UTF8(*pbkdf2_content);byte password[AES::MAX_KEYLENGTH];size_t plen = _pbkdf2_content.size();plen <= AES::MAX_KEYLENGTH ? memcpy(password, _pbkdf2_content.c_str(), plen) : memcpy(password, _pbkdf2_content.c_str(), AES::MAX_KEYLENGTH);std::string _pbkdf2_key = TCHAR_TO_UTF8(*pbkdf2_key);byte salt[AES::MAX_KEYLENGTH];size_t slen = _pbkdf2_key.size();slen <= AES::MAX_KEYLENGTH ? memcpy(salt, _pbkdf2_key.c_str(), slen) : memcpy(salt, _pbkdf2_key.c_str(), AES::MAX_KEYLENGTH);byte derived[SHA256::DIGESTSIZE];PKCS5_PBKDF2_HMAC<SHA256> pbkdf;byte unused = 0;pbkdf.DeriveKey(derived, sizeof(derived), unused, password, plen, salt, slen, 1024, 0.0f);std::string result;HexEncoder encoder(new StringSink(result));encoder.Put(derived, sizeof(derived));encoder.MessageEnd();return UTF8_TO_TCHAR(result.c_str());
}
#pragma endregion

2. 蓝图

测试结果

行效果如下:

完美实现加密验证。


参考

PBKDF2加密的实现
安全密码存储,该怎么做,不该怎么做?
Node.js crypto.pbkdf2()用法及代码示例
如何使用 PKCS5_PBKDF2_HMAC_SHA1()
PKCS5 PBKDF2 HMAC官方文档
crypto加密解密

UE4中实现PBKDF2加密验证相关推荐

  1. javascript 解密_Javascript中的AES加密和Java中的解密

    javascript 解密 AES代表高级加密系统,它是一种对称加密算法,很多时候我们需要在客户端加密一些纯文本,例如密码,然后将其发送到服务器,然后由服务器解密以进行进一步处理.AES加密和解密更加 ...

  2. Javascript中的AES加密和Java中的解密

    AES代表高级加密系统,它是一种对称加密算法,很多时候我们需要在客户端加密一些纯文本(例如密码)并将其发送到服务器,然后由服务器解密以进行进一步处理.AES加密和解密更加容易在相同的平台(例如Andr ...

  3. 聊聊 iOS 中的网络加密

    介绍下 公司的接口一般会两种协议的,一种HTTP,一种HTTPS的,HTTP 只要请求,服务器就会响应,如果我们不对请求和响应做出加密处理,所有信息都是会被检测劫持到的,是很不安全的,客户端加密可以使 ...

  4. python实现md5加密_Python实现md5加密验证访问接口总结

    实现md5加密验证访问接口总结 作者:李祥权 [摘要] 在项目开发中,遇到用户端点登陆接口需要加密验证才可以登陆的情况,当我们需要访问对方的接口时,为了保证访问的安全性,使用python实现md5加密 ...

  5. Android+Java中使用RSA加密实现接口调用时的校验功能

    场景 RSA加密 RSA算法是一种非对称加密算法,那么何为非对称加密算法呢? 一般我们理解上的加密是这样子进行的:原文经过了一把钥匙(密钥)加密后变成了密文,然后将密文传递给接收方,接收方再用这把钥匙 ...

  6. java 接口 安全加密_Java中的安全加密

    java 接口 安全加密 上一次我写关于密码学的文章时 ,我概述了Apache Shiro加密API,并展示了如何使用其两个对称密码. 我还写道:"您不需要在应用程序中加密和解密敏感数据的更 ...

  7. Java中的安全加密

    上一次我写关于密码学的文章时 ,我概述了Apache Shiro加密API,并展示了如何使用其两个对称密码. 我还写道:"您不需要在应用程序中对敏感数据进行加密和解密." 我了解了 ...

  8. ue4中在物体上加ui_UE4 物体位置同步相关源码分析浅谈

    前言 多图, 不想在源代码写注释, 不想贴代码块, 看的不清楚 版本4.21混4.22, 区别不大 文章属于旧有文章搬运, 之前在csdn上面 2019.10.27修改一版 物体位置信息同步, 或者说 ...

  9. Java中常用的加密方法(JDK)

    加密,是以某种特殊的算法改变原有的信息数据,使得未授权的用户即使获得了已加密的信息,但因不知解密的方法,仍然无法了解信息的内容.大体上分为双向加密和单向加密,而双向加密又分为对称加密和非对称加密(有些 ...

  10. App渗透中常见的加密与解密。

    随着App移动应用技术 的广泛应用及移动开发技术的飞速发展过程中,移动应用的安全也越来越被得到重视,在App服务端渗透中,我们在抓包时经常会发现App在数据传输过程中做了加密(如图1),以防止数据被查 ...

最新文章

  1. 微软Entity Framework安装和初步研究
  2. 《算法竞赛进阶指南》打卡-基本算法-AcWing 90. 64位整数乘法:位运算
  3. Quartz框架多个trigger任务执行出现漏执行的问题分析--转
  4. Spring Boot 2.x 启动全过程源码分析(全)
  5. 性能测试关注点整理总结!
  6. Ubuntu 12.10中的8个新功能,Quantal Quetzal
  7. 一步步编写操作系统 40 内存分页下用户程序与操作系统的关系
  8. PRML-系列一之1.5.5~1.5.6
  9. java建立新文件保存数据_关于java中创建文件,并且写入内容
  10. 使用JasperReport 引擎PDF报表,因为iText版本升级,由原来的包名com.lowagie.text.pdf.fonts转化为com.itextpdf.text.pdf.fonts
  11. 强命名防止dll被篡改
  12. python os模块详细_python中os模块函数方法详解最全最新
  13. [经典php视频]构建正则表达式解析网页中的图像标记img
  14. matlab 好看的颜色代码,科学网—什么是好的颜色表(colormap)? - 雷朝阳的博文...
  15. 方维众筹网站源码V1.71 PC+WAP+商业版
  16. 算法(arithmetic)
  17. 全文翻译:Deep Learning for Image Super-resolution: A Survey
  18. angular的传值,子传父,父传子
  19. WordPress网站利用WP2PCS-SY插件定时、增量网站备份至百度网盘
  20. js-获取子节点--具体节点调用

热门文章

  1. 华为Java社招面试经历详解【已拿到offer】
  2. 【Spring配置文件】Spring定时器的使用及配置
  3. C语言中的除法运算符
  4. C#使用NOPI导入Excel
  5. 会议及作用篇--项目管理(十三)
  6. 版人人商城V3.7.6开源解密版小程序前端+后端+安装使用视频教程
  7. .Net代码检查工具 Gendarme
  8. 有限元计算软件Fenics安装使用笔记(2)
  9. 小米路由器mini无线连接HP1010打印机
  10. 实现在线预览word文档