MD5的特点及加密原理
MD5是计算机安全领域广泛使用的一种散列函数,是计算机广泛使用的哈希算法之一。
固定长度 128 位 (16字节)
通常我们按照每4位的字面值来输出它。是一个长度为32位的字符串
无论输入多少字节的信息,输出的字节总是16字节
从结果无法反推原始数据,因为无论输入的信息是多少字节,输出总是16字节
输出的16个字节数据,没有任何规律可言。假如两次的输入只改变一个位,输出的结果也完全不同
两个不同的数据,想产生的MD5一致,是十分困难的。
在数据库记录密码时,并不记录密码本身,而是记录密码经过MD5加密后所产生的结果。当用户输入密码时,只需要把输入的密码再进行MD5校验,再与数据库中的结果进行对比就可以了。
这样的好处是,即便数据库被盗,也无法通过结果反推出密码是什么
当在网络中传输文件时,可能会导致文件数据丢失,或者被篡改,这个时候,在传输文件之前,往往先把文件经过MD5加密之后的结果传输过去,再传输文件,当文件传输过去后,再进行MD5加密,把两次的MD5结果进行对比,来判断文件是否完整,以及是否被篡改。
当发布程序时,可以同时发布该程序的MD5,这样在别人下载之后,只需要再经过MD5加密一遍,只需要判断自己下载程序的MD5与发布商的发布的MD5是否相同,从而可以判断程序是否被植入木马。
有的时候我们在云盘上上传一个很大文件,它几乎很快就传上去了,其实它并不是把文件传上去,它是先计算一下文件的MD5,并且在数据库中查找一个,看看有没有该MD5,如果有的话则直接使用该文件,从而实现文件妙传。
补齐的方法为,先补一个1,再补多个0
例:原数据为 01000101000
补位后数据为 01000101000100000…
使总长度除于512的余数为448
假如原始的长度满足除于512的余数为448,那么还需要补512位,使长度变为(N+1)*512 +448
这64位记录了原始数据的长度,至此,数据的总长度变成了512的整数倍 即 N * 64 字节大小
准备了四个标准幻数,每一个幻数都是4字节,即总共16个字节
A 01234567
B 89ABCDEF
C FEDCBA98
D 76543210
这四个标准幻数,就是用来循环计算初始值用的,最终的结果,也是这四个幻数,经过多轮哈希运算之后得到的结果
程序中使用的是小端字节,所以在程序中它实际是这样的
A 0X67452301
B EFCDAB89
C 0X98BADCFE
D 0X10325476
原始数据为 N * 64个字节大小
我们每次只计算其中一份,也就是每次只计算64字节
而 64 字节又被分为了16小份,也就是每份4字节
我们定义了四个函数
FF(A,B,C,D,X,S,AC)
GG (A,B,C,D,X,S,AC)
HH (A,B,C,D,X,S,AC)
A,B,C,D就是这四个幻数
X则是这每一小份的四字节数
S,AC是一些固定常数

这些函数的的作用就是通过一些运算改变了第一个参数的值
这四个幻数按照下面顺序执行了16次

讲四个幻数按照不同的顺序依次进行计算,同时把每份数据按照数据输入
当处理完这4字节数据后,把得到的四个新标准幻数与原来的幻数相加,得到新的标准幻数,作为下一个四字节数据的起始幻数。
处理完64个字节后,得到一个新的标准幻数,再把这个新的标准幻数,作为第二轮64字节的标准幻数输入。
当处理完所以的数据后,最终的四个标准幻数,按照顺序以16进制显示出来,就是最终的MD5结果
如
A 0xbfcbf9ce
B 0xc4105a80
C 0x02599277
D 0x5ce99ee2
最终结果 cef9cbbf805a10c477925902e29ee95c
我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%
在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList()Obt
作为新的阿里云用户,您可以50免费试用多种优惠,价值高达1,700美元(或8,500美元)。这将让您了解和体验阿里云平台上提供的一系列产品和服务。如果您以个人身份注册免费试用,您将获得价值1,700美元的优惠。但是,如果您是注册公司,您可以选择企业免费试用,提交基本信息通过企业实名注册验证,即可开始价值$8,500的免费试用!本教程介绍了如何设置您的帐户并使用您的免费试用版。关于免费试用在我们开始此试用之前,您还必须遵守以下条款和条件才能访问您的免费试用:只有在一年内创建的账户才有资格获得阿里云免费试用。通过此免费试用优惠,用户可以免费试用免费试用活动页面上列出的每种产品一次。如果您有多个帐
我在加密来self正在使用的第三方供应商的值时遇到问题。他们的指令如下:1)Converttheencryptionpasswordtoabytearray.2)Convertthevaluetobeencryptedtoabytearray.3)Theentirelengthofthearrayisinsertedasthefirstfourbytesontothefrontofthefirstblockoftheresultantbytearraybeforeencryption.4)EncryptthevalueusingAESwith:1.256-bitkeysize,2.25
我的ruby脚本从命令行参数获取某些输入。它检查是否缺少任何命令行参数,然后提示用户输入。但是我无法使用gets从用户那里获得输入。示例代码:test.rbname=""ARGV.eachdo|a|ifa.include?('-n')name=aputs"Argument:#{a}"endendifname==""puts"entername:"name=getsputsnameend运行脚本:rubytest.rbraghav-k错误结果:test.rb:6:in`gets':Nosuchfileordirectory-raghav-k(Errno::ENOENT)fromtes
首先,关于我们系统的一些信息,它基本上是建筑行业的电子招标解决方案。所以:列表项我们的系统有多家公司每个公司都有多个用户每家公司可以创建多个拍卖然后其他公司可以为可用的拍卖提交他们的出价。一个出价包含数百或数千个单独的项目,我们只需要加密这些记录的“价格”部分。我们面临的问题是,我们的大客户不希望我们知道投标价格,至少在投标过程中是这样,这是完全可以理解的。现在,我们只是通过对称加密对价格进行加密,因此即使价格在数据库中有效加密,他们担心的是我们拥有解密价格的key。因此,我们正在研究某种形式的公钥加密系统。以下是我们对解决方案的初步想法:当一家公司注册时,我们会使用OpenSSL为其
我正在尝试对某些帖子的评论使用简单的身份验证。用户使用即时ID和密码输入评论我使用“bcrypt”gem将密码存储在数据库中。在comments_controller.rb中像这样@comment=Comment.new(comment_params)bcrypted_pwd=BCrypt::Password.create(@comment.user_pwd)@comment.user_pwd=bcrypted_pwd当用户想要删除他们的评论时,我使用data-confirm-modalgem来确认数据在这部分,我必须解密用户输入的密码以与数据库中的加密密码进行比较我怎样才能解密密码,
是否可以创建8个字符长的md5散列? 最佳答案 MD5创建16字节的哈希值。您当然可以将字符串裁剪为八个字符,如myString[0..7]一样,但请注意,这不再是有效的MD5散列。 关于ruby-我可以创建长度为8的md5哈希吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/5854208/
我在Rails中有一个具有以下方法的应用程序,该方法可以加密和解密文本并与Java客户端通信。defencrypt(string,key)cipher=OpenSSL::Cipher::AES.new(128,:CBC)cipher.encryptcipher.padding=1cipher.key=hex_to_bin(Digest::SHA1.hexdigest(key)[0..32])cipher_text=cipher.update(string)cipher_textexcenddefhex_to_bin(str)[str].pack"H*"enddefbin_to_hex(
我正在考虑使用attr_encrypted在Rails应用程序中用于字段级加密的gem。如何生成用于此gem的加密key?更新:Encryptor的文档,它是attr_encrypted使用的底层加密,声明如下(在Usage|Basic下):secret_key=Digest::SHA256.hexdigest('asecretkey')encrypted_value=Encryptor.encrypt('somestringtoencrypt',:key=>secret_key)我猜想key可以是任意长度的随机字符串,而对hexdigest的调用将从中计算出适当的固定长度字符串。这是