【HarmonyOS NEXT】字符串MD5加密的结果和服务器端加密结果不一致,导致接口无法通过验证

 【关键字】

MD5加密 / 字符串

【问题描述】

鸿蒙自带的加密库MD5加密结果有问题,简单字符串加密没有什么问题,但是遇到一个字符串加密出来的结果和服务器端加密结果不一致导致接口无法通过验证。

后来使用第三方库https://ohpm.openharmony.cn/#/cn/detail/@ohos%2Fcrypto-js,加密结果才与服务器加密结果匹配。

具体测试字符串如下:

"kbaptkJGtByWrQaP\tjkJrRIacBwcpK68d\t1708500023960\t/user/register2\t\t{\"nonces\":\"f89caa35-10bd-45ef-80ec-ec37715aff31\",\"deviceType\":\"ios\",\"smsCode\":\"303701\",\"pwd\":\"Xa1vKgm51p8=\",\"nickname\":\"\",\"deviceId\":\"a0a0cadd-b6c6-43dd-9599-bde86cbb6db4\",\"phone\":\"18306215493\",\"cityId\":\"420100\",\"gender\":\"\",\"cityName\":\"武汉市\",\"birthday\":\"\",\"tdid\":\"cf5094ba-a0b8-4b4d-ae30-9128fa1eba5d\"}"

期望值如下:

"e9a7285f5dce4df160bf081e298ffb8e"

【解决方案】

可以参考以下样例代码进行开发,经测试doMdByPromise中str2结果是您的期望值:

import { cryptoFramework } from '@kit.CryptoArchitectureKit';
import { BusinessError } from '@kit.BasicServicesKit';
import { buffer, util } from '@kit.ArkTS';

let base64 = new util.Base64Helper();

function uint8ArrayToHexStr(data: Uint8Array): string {
let hexString = "";
let i: number;
for (i = 0; i < data.length; i++) {
let char = ('00' + data[i].toString(16)).slice(-2);
hexString += char;
}
return hexString;
}

// 字节流转成可理解的字符串
function uint8ArrayToString(array:Uint8Array) {
// 将UTF-8编码转换成Unicode编码
let out: string = "";
let index: number = 0;
let len: number = array.length;
while (index < len) {
let character = array[index++];
switch(character >> 4) {
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
out += String.fromCharCode(character);
break;
case 12:
case 13:
out += String.fromCharCode(((character & 0x1F) << 6) | (array[index++] & 0x3F));
break;
case 14:
out += String.fromCharCode(((character & 0x0F) << 12) | ((array[index++] & 0x3F) << 6) | ((array[index++] & 0x3F) << 0));
break;
default:
break;
}
}
return out;
}

function stringToUint8Array(str: string) {
return new Uint8Array(buffer.from(str, 'utf-8').buffer)
}


function doMdByPromise() {
// 摘要算法名称。
let mdAlgName = "MD5";
// 要进行摘要的数据。
let message = "kbaptkJGtByWrQaP\tjkJrRIacBwcpK68d\t1708500023960\t/user/register2\t\t{\"nonces\":\"f89caa35-10bd-45ef-80ec-ec37715aff31\",\"deviceType\":\"ios\",\"smsCode\":\"303701\",\"pwd\":\"Xa1vKgm51p8=\",\"nickname\":\"\",\"deviceId\":\"a0a0cadd-b6c6-43dd-9599-bde86cbb6db4\",\"phone\":\"18306215493\",\"cityId\":\"420100\",\"gender\":\"\",\"cityName\":\"武汉市\",\"birthday\":\"\",\"tdid\":\"cf5094ba-a0b8-4b4d-ae30-9128fa1eba5d\"}";
let md = cryptoFramework.createMd(mdAlgName);
;
console.info("[Promise]: Md algName is: " + md.algName);
// 如果数据量较小,可以使用 update() 一次传入所有数据。输入参数的长度没有限制。
let promiseMdUpdate = md.update({ data: stringToUint8Array(message) });
promiseMdUpdate.then(() => {
// 调用 digest() 以返回结果。
let PromiseMdDigest = md.digest();
return PromiseMdDigest;
}).then(digestOutput => {
let mdOutput = digestOutput.data;
let str2 = uint8ArrayToHexStr(mdOutput);
let str = base64.encodeToStringSync(mdOutput);
let str1 = uint8ArrayToString(mdOutput);
console.info("[Promise]: MD result: " + mdOutput);
let mdLen = md.getMdLength();
console.info("[Promise]: MD len: " + mdLen);
}).catch((error: BusinessError) => {
console.error("[Promise]: error: " + error.message);
});}

  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
***5加密,可以使用VBA宏来完成。VBA(Visual Basic for Applications)是一种在Microsoft Office套件中广泛使用的编程语言。下面是一个示例代码来实现在Word中使用VBA宏进行MD5加密的方法: 1. 打开Word文档,按下`Alt+F11`打开VBA编辑器。 2. 在VBA编辑器中,点击"插入"菜单,选择"模块",在新建的模块中输入以下代码: ```vba Function MD5Hash(ByVal input As String) As String Dim md5Obj As Object Dim bytes() As Byte Dim result() As Byte Dim i As Long ' 创建MD5对象 Set md5Obj = CreateObject("System.Security.Cryptography.MD5CryptoServiceProvider") ' 将输入转换为字节数组 bytes = StrConv(input, vbFromUnicode) ' 计算MD5哈希值 result = md5Obj.ComputeHash(bytes) ' 将字节数组转换为十六进制字符串 For i = 1 To LenB(result) MD5Hash = MD5Hash & LCase(Right("0" & Hex(AscB(MidB(result, i, 1))), 2)) Next i ' 释放对象 Set md5Obj = Nothing End Function ``` 3. 保存并关闭VBA编辑器。 4. 在Word文档中添加一个文本框或者输入框,用于输入要加密的内容。 5. 在文本框或者输入框的事件处理程序中调用上面定义的MD5Hash函数,并将结果显示出来。例如,可以在文本框或者输入框的"失去焦点"事件中添加以下代码: ```vba Private Sub TextBox1_LostFocus() Dim input As String Dim hashed As String ' 获取输入内容 input = TextBox1.Text ' 调用MD5Hash函数进行加密 hashed = MD5Hash(input) ' 将加密结果显示出来 MsgBox "MD5加密结果: " & hashed End Sub ``` 现在,当用户在文本框或者输入框中输入内容并失去焦点时,会弹出一个消息框,其中显示了输入内容的MD5加密结果。请注意,在这个例子中,我使用了一个名为"TextBox1"的文本框作为输入框,你可以根据自己的需求修改代码。 希望以上信息能对您有所帮助。<span class="em">1</span><span class="em">2</span> #### 引用[.reference_title] - *1* [C++实现md5加密算法](https://download.csdn.net/download/q6115759/9807338)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [基于JAVA代码非的对称加密RSA的实现及其源代码](https://download.csdn.net/download/u012134073/88281987)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值