UE4中实现PBKDF2加密验证_如何加密部分ue蓝图_打磨的石头的博客-程序员宅基地

技术标签: c++  ue4  

UE4中Crypto++库加密解密

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



前言

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


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

代码

首先要生成一个盐值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加密解密

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_43923422/article/details/123474199

智能推荐

学习笔记(07):Web前端与HTML5移动开发系列一:HTML篇-12,图片标签的介绍-程序员宅基地

掌握HTML4.01常见基本标签;熟练HTML结构和语法规范;使用列表系列标签完成常见网页中的列表结构;熟练掌握表格,表单都系列标签,在项目中熟练使用;了解哪些标签在项目中经常使用,哪些标签已被废除;迈出HTML5开发的第一步,为后续课程打下基础;...

「P8t.ch」靠卖QR-Code实体商品,想变成下一个TinyURL-程序员宅基地

转载http://column.iresearch.cn/u/mr6/archives/2008/32204.shtml「QR-Code」就是二维条码,长得像一个黑黑的点点的方框框,通常你会在路旁海报的一角、广告的一隅,还是杂志的某页看到它,只要手机有支援它,只要拍下,就会自动下载资讯到手机,或直接用手机上某个网站观赏。由于下午我有一场和「QR-Code」相关的活动,今早先了解一下QR

/etc/sudoers文件解析-程序员宅基地

CATALOG前言规则讲解第一部分A第二部分B第三部分C第四部分D第五部分E举例前言/etc/sudoers文件一般涉及到linux系统中关于sudo命令的权限配置问题。规则讲解sudoers文件的数据,每一行分为五个部分,我们用ABCDE来表示。一般情况下是: A B = {} {D} E且C与D是可以省略的,我们用大括号扩起来方便大家注意到,但真正书写命令的时候不需要打括号。第一个部分A代表授权使用sudo的用户或者组第二部分B代表允许授权用户在哪些主机上使用这些权利第三部分C代_etc/sudoers

iOS海哥开发笔记 (海哥原创,retain、strong、weak、assign区别)_assign hori-程序员宅基地

感觉做iOS开发这么久了,跟同事大哥们学到了不少东西,在此感谢李群,余灵大哥,在任务艰巨的时候,也总是帮助我修改bug,解决逻辑问题,在此感谢心地善良的你们,向你们学习。在学习之中想为以后的同仁们建立一些有帮助的文档,文章,这就是我要做日志的目的,东西不难,但是经常会用到,所有的东西还是要从最基本的去理解,做代码不是实现了就可以(以前吃过这样的亏,用别人的库不明白原理,最后返工了)小到一个细节,以_assign hori

Linux CentOS7 内核升级_[ -d /sys/firmware/efi ]-程序员宅基地

1. yum 安装更新内核(1.1) 添加ELRepo gpg key到系统rpm --importhttps://www.elrepo.org/RPM-GPG-KEY-elrepo.org(1.2) 添加ELRepo到系统rpm -Uvh https://www.elrepo.org/elrepo-release-7.el7.elrepo.noarch.rpm(..._[ -d /sys/firmware/efi ]

11.8-11.14_小白⁤ ͏的博客-程序员宅基地

if-else语句简单的if-else语句的基本结构:语义是: 如果表达式的值为真,则执行代码块1,否则执行代码块2。多重if-else语句C语言中多重if-else语句,其结构如下:嵌套if-else语句C语言中嵌套if-else语句。嵌套if-else语句的意思,就是在if-else语句中,再写if-else语句。其一般形式为:多重循环多重循环就是在循环结构的循环体中又出现循环结构。在实际开发中一般最多用到三层重循环。因为循环层...

随便推点

J2EE-程序员宅基地

J2EE是Java2平台企业版(Java 2 Platform,Enterprise Edition)J2EE核心是一组技术规范与指南,其中所包含的各类组件、服务架构及技术层次,均有共同的标准及规格,让各种依循J2EE架构的不同平台之间,存在良好的兼容性,解决过去企业后端使用的信息产品彼此之间无法兼容,企业内部或外部难以互通的窘境。J2EE组件和“标准的” Java类的不同点在于:

减治、分治和变治的区别和联系_分治和减治的区别-程序员宅基地

减治:利用了一个问题给定实例的解和同样问题较小实例的解之间的某种关系,常用的有n和n-1的关系,有了这种关系我们可以自顶向下地递归求解,也可以自底向上地迭代实现,从较小实例开始求解这一角度来看减治也叫增量法。减治法的三种方式:1***.减常量***每次迭代总是从实例中减去一个相同的常量,一般为1。如求an的值,我们从an=an-1*a可以看出n和n-1之间的关系,所以可以得到递归式: f..._分治和减治的区别

react16.8 antd按需加载配置(已经弹出和未弹出分别的配置)以及主题配置_antd tabs 取消按需加载-程序员宅基地

误区,antd按需加载同样是需要先安装antd,只是通过插件的配置实现不用再进行样式的引入,可以直接引用antd组件进行开发怎样判断按需加载配置成功?通过组件引用的判断,在不引入antd样式的前提下,直接引入,使用组件,看组件样式是否有效,如果生效则按需加载配置成功完成的配置流程安装antdnpm i antd --save安装babel-plugin-impor..._antd tabs 取消按需加载

SOLIDWORKS Simulation 2018的亮点:全新的拓扑研究功能_sw拓补-程序员宅基地

SOLIDWORKS Simulation 2018引入了一种新的研究类型--拓扑研究(Topology Study),帮助设计人员和工程师能够开发出创新的最小质量的元件。 在线性静态载荷和约束的条件下,拓扑研究将从有限元网格中“移除”元素,直到达到目标质量或最好的刚度和重量的尺寸比例为止。这种元素去除的迭代过程受限于研究限制,例如最大允许挠度和任何制造控制。让我们通过一个简单的例子来深入研究_sw拓补

new Set数组去重_new set去重_曾泳锋的博客-程序员宅基地

利用该方法去重 <script> let arr = [1,1,3,3,4,4,5] console.log([...new Set(arr)]); //打印数组[1,3,4,5] </script>_new set去重

python程序练习题第三章_python核心编程-第三章-习题-程序员宅基地

1.这是python的语言特性,python先创建对象,在给变量赋值时,不需要定义变量的名称和类型,它实际是用变量引用对象。变量类型在给变量赋值时自动声明2.原因类似变量无须声明类型3.python用下划线作为变量前缀和后缀指定特殊变量,对解释器有特殊意义,也是内建标识符所使用的特殊符号,故一般避免用下划线作为变量的开头和结尾4.python一行可以书写多个语句,多个语句间用";"分隔。但是为了良..._python语句x,y,z=1,2,3;y,z,x=z,x,y; print(x y,z)的结果是___。