Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Encryption 自验证加密字符串-该方法可行吗?_Encryption_Checksum - Fatal编程技术网

Encryption 自验证加密字符串-该方法可行吗?

Encryption 自验证加密字符串-该方法可行吗?,encryption,checksum,Encryption,Checksum,我有一个钥匙串,它允许客户拥有额外的功能 显然,我希望软件检查这个字符串是否有效,并且没有修改 以下想法可行吗 获取密钥字符串作为加密值,并在Base64中对其进行编码 (出于我的目的,我的加密字符串大约为100个字符) 计算校验和(MD5),当然要使用专用的salt 将校验和编织到加密数据中 原则上: xxxxCxxxxxxCxxxxxxxxCxxxxxxxxxxCxxxxxxxxxxxxxCxxx 可以通过加密数据的第一个cher来确定编织到加密数据中的位置,从而创建多达16种不同的

我有一个钥匙串,它允许客户拥有额外的功能

显然,我希望软件检查这个字符串是否有效,并且没有修改

以下想法可行吗

  • 获取密钥字符串作为加密值,并在Base64中对其进行编码 (出于我的目的,我的加密字符串大约为100个字符)
  • 计算校验和(MD5),当然要使用专用的salt
  • 将校验和编织到加密数据中
原则上:

xxxxCxxxxxxCxxxxxxxxCxxxxxxxxxxCxxxxxxxxxxxxxCxxx
  • 可以通过加密数据的第一个cher来确定编织到加密数据中的位置,从而创建多达16种不同的模式
在检查代码有效性时,我只需“取消保存”校验和,测试它是否正确,从而知道数据是否已修改


我的想法正确吗

您正在考虑的加密功能称为“身份验证”,有许多成熟的方法。您应该极力避免自己发明,特别是使用像MD5这样的过时的散列。当加密系统通过身份验证时,它可以检测密文的更改

最好的方法是使用经过身份验证的密码模式,如AES-GCM。正确使用,将加密和身份验证结合在一个操作中。在解密经过身份验证的方案时,如果修改了密码文本,则解密将失败

如果您没有访问AES-GCM的权限,下一个选项是AES-CBC+HMAC,它使用更普遍的AES-CBC和随机IV,并在消息末尾附加一种加密哈希(称为HMAC)以对其进行身份验证。为了进行身份验证,您需要删除HMAC,使用它验证密码文本是否未修改,然后继续正常解密。此方案通常称为“加密然后MAC”


实现细节将取决于您的语言和框架。

您真正想要实现的是DRM,使用一些特殊的模糊技术。如果有人能对你的软件进行逆向工程,那么你的技术就不是特别难克服。如果他们无法反转你的软件,那么你的技术就毫无意义地复杂了,只需对MAC使用适当的加密。Rob,这是很好的信息。当然还有一些有用的建议。是否正确理解客户端密钥将是CCCC HHHHHHH(C=crypt,H=HMAC),为了进行身份验证,我将两者分开,然后将从C计算出的H与存储的H进行比较?是的,但通常还需要在前端附加一个IV,因此它是IV+crypt+HMAC。CBC需要随机静脉注射。如需类似格式的示例(有多种语言的实现),请参阅。该格式还包括SALT,如果您使用密码而不是随机密钥进行加密,则需要SALT。鉴于您的整个数据只有大约100字节,完整的RNCryptor格式可能太重。它增加了66字节的开销。但是如果你能负担得起空间,它是一个简单易用的系统,有很多实现。不过,如果需要的话,也有办法把它缩小一点。