1、杂凑密码算法
可以对任意长度的消息M进行压缩,输出定长的消息摘要/杂凑值h,表示为h = H(M)。
一般来说,H具备三个性质:
(1)单向性。已知h,试图找打M满足h=H(M)是困难的。
(2)抗第二/二次原像攻击(弱抗碰撞性)。给定M1,试图找到M2满足h1=h2是困难的。
(3)强抗碰撞性。试图找到H(M1)=H(M2)是困难的。
密码杂凑算法主要有2种结构:M-D结构(MD5、SHA1、SHA2、SM3)和海绵结构(SHA3)。对于MD结构,也就是对填充后的消息进行分组后依次输入F函数进行压缩,上一个分组的结果结果下一个分组的输入之一,最后一个F的结果即是最终的杂凑值。所以可以说,杂凑算法的安全性取决于F,如果F具备抗碰撞能力,则杂凑函数也具备抗碰撞能力。
| 算法名称 | 分组长度bit | 输出长度bit | 结构 |
| MD5 | 512 | 128 | MD |
| SHA1 | 512 | 160 | MD |
| SHA-224 | 512 | 224 | MD |
| SHA-256 | 512 | 256 | MD |
| SHA-384 | 1024 | 384 | MD |
| SHA-512 | 1024 | 512 | MD |
| SHA-512/224 | 1024 | 224 | MD |
| SHA-512/256 | 1024 | 256 | MD |
| SM3 | 512 | 256 | MD |
| SHA3-224 | - | 224 | 海绵 |
| SHA3-256 | - | 256 | 海绵 |
| SHA3-384 | - | 384 | 海绵 |
| SHA3-512 | - | 512 | 海绵 |
| SHAKE128 | - | 变长 | 海绵 |
| SHAKE256 | - | 变长 | 海绵 |
2、带密钥的杂凑算法
使用M||h的方式保护M的完整性是存在安全问题的,例如攻击者可以将其整体替换为M'||h',完整性验证也可通过。故认为只使用密码杂凑算法是无法保证数据完整性的。HMAC(带密钥的杂凑算法)提出能够解决这个问题。HMAC具体如hmac = HMAC(K,M),其中密钥K的长度取对应的杂凑算法分组长度和输出长度之间,如MD5,K的长度区间是[128,512] bit。在HMAC过程中包括2次H计算,取第二次H计算的最左边m比特,作为HMAC的输出。
3、SM3算法
关于SM3算法,具体标准见GMT 0004-2012 SM3 密码杂凑算法,MD结构,输入消息长度小于2^64bit,分组长度为512,输出长度为256。
3.1 填充规则
在消息M的末尾填充1,然后填充k个0,最后填充64bit的二进制串(表示消息M的长度,这里对应输入消息M长度不能大于2^64bit),从而得到n个512bit的分组。
3.2 迭代过程
对于n个分组B0-Bn-1,做迭代Vi+1 = CF(Vi,Bi)V0取256bit的IV,这里CF是压缩函数,压缩结果为V。在压缩函数之前,对Bi要进行扩展,扩展为132个消息字(32bit)。在压缩函数CF中,产生64轮迭代,也就是说对于n个分组Bi,共要计算64n轮。
4、SM3安全性和效率
SM3和SHA256消息分组、迭代轮数、输出长度均相同,同时新引入16步全异或操作、消息双字介入、加速雪崩效应的P置换。能有效抵抗强碰撞性的差分攻击、弱碰撞性的线性分析和比特追踪等密码分析方法。
我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A
在Ruby中是否有Gem或安全删除文件的方法?我想避免系统上可能不存在的外部程序。“安全删除”指的是覆盖文件内容。 最佳答案 如果您使用的是*nix,一个很好的方法是使用exec/open3/open4调用shred:`shred-fxuz#{filename}`http://www.gnu.org/s/coreutils/manual/html_node/shred-invocation.html检查这个类似的帖子:Writingafileshredderinpythonorruby?
目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称
我正在使用ruby2.1.0我有一个json文件。例如:test.json{"item":[{"apple":1},{"banana":2}]}用YAML.load加载这个文件安全吗?YAML.load(File.read('test.json'))我正在尝试加载一个json或yaml格式的文件。 最佳答案 YAML可以加载JSONYAML.load('{"something":"test","other":4}')=>{"something"=>"test","other"=>4}JSON将无法加载YAML。JSON.load("
有没有办法在Rails中为确认字段自定义消息?例如在设计中我必须输入密码和password_confirmation并且错误消息是:Passwordconfirmationdoesn'tmatchPassword我可以更改事件记录语言环境消息(“不匹配”),但它会在该语言环境消息的开头和结尾输出密码确认和密码,所以我得到如下内容:"PasswordconfirmationmustmatchPassword"有没有办法将其更改为不同的字符串?PasswordconfirmationandPasswordmustmatch.编辑另一件事是拥有完全自定义的消息,例如:'Setpassword
默认情况下:回形针gem将所有附件存储在公共(public)目录中。出于安全原因,我不想将附件存储在公共(public)目录中,所以我将它们保存在应用程序根目录的uploads目录中:classPost我没有指定url选项,因为我不希望每个图像附件都有一个url。如果指定了url:那么拥有该url的任何人都可以访问该图像。这是不安全的。在user#show页面中:我想实际显示图像。如果我使用所有回形针默认设置,那么我可以这样做,因为图像将在公共(public)目录中并且图像将具有一个url:Someimage:看来,如果我将图像附件保存在公共(public)目录之外并且不指定url(同
我正在尝试对某些帖子的评论使用简单的身份验证。用户使用即时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来确认数据在这部分,我必须解密用户输入的密码以与数据库中的加密密码进行比较我怎样才能解密密码,
我有一个允许更新用户记录的表单。它包含:password和:password_confirmation字段,但我不希望在数据库中已存储加密密码时对它们运行验证。View文件中的字段:'ConfirmPassword'%>在互联网上搜索时,我发现了这段代码,我认为它是针对以前版本的Ruby/Rails的。(我会把它放在我的用户模型中。)validates_presence_of:password,:on=>create由于我的用户模型中密码验证的语法不同(如下),我对我需要的语法感到困惑。validates:password,:presence=>true,:confirmation=>
我正在使用devise,当用户更改密码时,网站会将他们注销。我在网上读到,添加sign_in可以解决问题但不起作用,并且当密码更改时用户会注销。这是我的代码if@user.errors[:base].empty?and@user.update_attributes(params[:user])sign_in(current_user,:bypass=>true)flash[:success]="Useraccounthasbeensuccessfullyupdated"redirect_toedit_user_path(params[:site_id],@user)elserender
我在一个ruby文件中有一个函数可以像这样写入一个文件File.open("myfile",'a'){|f|f.puts("#{sometext}")}这个函数在不同的线程中被调用,使得像上面这样的文件写入不是线程安全的。有谁知道如何以最简单的方式使这个文件写入线程安全?更多信息:如果重要的话,我正在使用rspec框架。 最佳答案 您可以通过File#flock给锁File.open("myfile",'a'){|f|f.flock(File::LOCK_EX)f.puts("#{sometext}")}