手机存储卡怎么加密
手机存储卡怎么加密 我这次使用了华为Mate 9和华为EMUI5.0来演示这个功能,实际上在华为EMUI 4.X里这个功能就已经有了,也就是说这功能目前已经基本覆盖了华为和荣耀系列的全部手机。在EMUI4.X里菜单位置也都一样,只要顺着路径找,就能找到这个功能,使用简单效果好。 下图是正常情况下的文件管理工具,其中可以看到内存和存储卡的信息选项,而再点进去的话,存储卡中保存的内容就被原原本本呈现出来了。正常情况下很多手机即使加密无法访问,只要把存储卡取出来放入别的手机或者读卡器里,也能轻松化解。接下来的动作就是防止这种事情发生。 首先如下图。进入手机的设置菜单,在菜单中找到高级功能一栏,进入高级功能之后,找到一个名为“安全”的菜单项。 在“安全”这一项里,可以看到一个功能叫做“设置SD卡密码”。当点击这个功能的时候,系统会出现一个风险提示,不要管它,继续操作。 继续操作之后,会出现密码栏。密码默认的输入状态不是明文的,我给转换成明文只是为了介绍一下规则。这里要输入一个至少四位字符的密码,其中至少要含有一个字母。输入之后再确认一遍,然后点完成。 到此为止,一个你个人专属的存储卡就诞生了。设置好密码之后如同上图右边一样,本机的SD卡密码选项会从原来的一栏变成两栏,提供修改密码和取消密码选项。设置密码、修改密码和取消密码不会对存储卡里的数据产生影响。 接下来这张SD卡会变成什么样呢?我把它从华为Mate 9里取出来,放入另一款华为手机中。此时系统出现了密码输入窗口,要求输入设置的存储卡密码才能继续使用。如果点击取消,系统就无法访问存储卡,在文件管理里也根本找不到任何存储卡。 如果在另一台华为手机进入了刚才的“安全”菜单,会看见下图中的两个选项。这时候只有两个选择,第一个是输入密码解锁存储卡,第二个是强制清除密码,即对存储卡进行格式化。总之,如果没密码,最好的.结果也只是卡能用了,里面的数据已经灰飞烟灭。 实测发现,如果把已经加密的存储卡放入到不支持此功能的手机上,比如其他品牌的手机,更是直接就无法找到存储卡,连输入密码的机会都不给。那么如果求助于PC能否读取到其中内容呢?经过我实验,结果也是此路不通。放入读卡器的存储卡变成了这个样子: 虽然分配了盘符,但在电脑里没有显示。通过磁盘管理无法获取容量信息、无法访问数据、无法格式化,一副死猪不怕开水烫的样子。和把卡放入非华为手机一样,通过读卡器连接到PC之后,连格式化都是禁止的,简直拿这张存储卡毫无办法。总之,要么找一个华为手机并输入密码或者格式化,要么放回原来的华为手机里,没有别的选择。
内存卡如何加密
问题一:如何给内存卡加密 很多种方式,一:用优化大师加密系统,
二:用单独的加密软件,网站上有很多加密大师,你可以搜索一下,但是每个加密软件都要有软件的本身才能解密,那些说可以单独解密的软件性能不好,建议不要用,加密的目的就是安全~~,那些单独解密梗可以很容易的破解
问题二:内存卡如何加密让别人看不到? 推荐您使用隐身侠隐私加密工具。它是一款隐私加密工具,可以加密U盘、电脑硬盘、移动硬盘等存储信息,绿色无插件。简单易用,安全系数高。支持所有WINDOWS系统,它的使用方法如下:一、从隐身侠官网下载或在百度里边搜索隐身侠隐私加密工具,下载并安装
二、输入您的邮箱(注意要真实地邮箱,以便日后您忘记密码时可以通过此邮箱找回)
三、按照操作提示建立保险箱。根据您的需要进行保险箱口令设置
四、将您要加密保护的文件放入隐身侠保险箱中即可。您关闭隐身侠时,保险箱自动“隐身”,这样您的信息就加密“隐藏”了,除了您自己任何人都无法知道您的保险箱在哪。您启动保险箱时,加密信息又都出来了。
问题三:在电脑上怎么给内存卡加密 在WIN7下简单而且加密安全。
开始--控制面板-系统和安全--BITOCKER驱动器加密--启用BITOCKER选择你要加密的磁盘。
其它操作系统,你就去百度搜索一个什么U盘加密锁之类就可以了。
问题四:内存卡加密怎么取消? 如果里面没有重要数据,我建议你用我的方法格式化一下就好了,方法如下:
点开始菜单→控制面板→管理工具→计算机管理→磁盘管理,只要你能在这里面看到这个盘的盘符,OK,说明你的移动硬盘是正常的,右键选择想格式化,文件格式选择FAT32,分配单元选“默认值”,点击“确定”,稍等一会儿,你就会看见“状态良好”几个字,格式化完成。
如果不行,看看注册表:HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\StorageDevicePolicies
里WriteProtect键是否为1,如是,改为0
另外,还可能:
一种情况就是MMC是没有写保护开关的.出现写保护是很不正常的现象.不是什么在手机里给卡加了密码什么的
这其实是因为读卡器的大小与MMC卡本身无法接触完全.MMC的保护的工作原理其实就是控制金属接触点的接触面积,如果无法保证全部的金属片压下,就默认为是写保护开关打开,这也是RS-MMC卡上写保护开关的做法.
解决的办法其实就是找一张硬一点的纸随MMC卡的正面一起插入读卡器中,保证金属片完全接触.你也可以用手压着送进读卡器里面.
二种情况是MMC卡由于长时间插拔,导致了金属接触片,有氧化或磨损的现象,遇到这情况就用解决内存条的办法对付,找一个橡皮擦,在金属片上来回的擦几遍,一般没有大的破损都可以解决.
三种情况是本身MMC卡的接触片就有问题,或者MMC卡的寿命已到,这样只能买新的或者找商家了.
还不行,那就可能是ntfs的权限了。
问题五:怎么给内存卡里面的文件加密? 最简单的就是安装一款文件夹加密软件,推荐一款文件夹加密高级版 9.10(华军有)。
1 下载安装文件文件夹加密高级版 9.10
2 在需要加密的文件夹上单击右键选择加密。
3 输入你想设置的密码,点击确定就ok了。
问题六:如何加密内存卡 如果需要手机内存加密,可以试一下misuo 。是专门针对手机上数据进行加密的,内存卡可以试一下U盘超级加密3000.是专门针对U盘,移动硬盘等磁盘上数据进行加密的,使用非常方便,可以试一下。
问题七:怎样给智能手机内存卡加密!! 在手机设置那里,进入数据管理,看到储存卡的图标,点击进入,然后在选项那里选择 设定密码 就可以进行对储存卡进行设置密码了。你想给特定文件加密的话,推荐你使用 文件加密 这软件,就可以了。简单实用,不过你要记住密码的哦…
问题八:怎么破解加密内存卡 1、使用EasyRecovery Pro ,选择数据恢复Advanced Recovery(选用高级选项自定义数据恢复功能);
2、选择已变为RAW格式的盘符,点击下角的高级选项; 3、在文件系统扫描中,文件系统选“NTFS,点高级扫描,选择右下角的“高级选项”,把簇大小和数据起始位置都设为0;
4、点击分区设置,使用MFT方式(这点一定不能错);然后确定;
5、点击下一步,开始扫描文件系统,然后就是等,要的时间比较长,要耐心。完成后就会发现找到了一个NTFS的盘符,再点击找到的盘符,开始扫描;
6、扫描完成后你就会发现所有的文件都已找到,然后点击恢复,选择一个可用的盘来存你恢复的文件就行;
7、最后格式化出问题的盘 把恢复的文件拷回去 OK 一切都完好如初。
问题九:手机存储卡怎么加密? 打开多媒体资料,按左软键,就有加密这个选项,加密了以后,内存卡用读卡器在电脑丹就读不出来了,有利于你卡内文件的安全。不过你要记清你的密码。
问题十:内存卡被加密了怎么办,急急急!~ 你打开我的电脑,选择工具-文件夹选项-查看-高级设置
不要隐藏系统受保护的文件,显示所有文件夹
你就会发现你的文件都以隐藏文件夹的方式在你的盘里那些文件,也就是隐藏的,右击属性,有个选项是隐藏,把那个勾去掉即可内存卡上可能有贰毒,去杀杀毒试试吧。
如何给内存卡加密
以windows10系统,使用BitLocker加密为例,具体操作方法如下:1、打开计算机,在界面中找到内存卡所在的盘符2、右键单击内存卡所在的盘符3、在右键单击的选项中选择启用BitLocker4、等待BitLocker在该内存卡上的安装5、选择内存卡需要的加密方式,一般选择密码加密6、在选项卡中输入加密的密码7、完成之后,点击下一步8、选择保存密码的方式。如果有Microsoft账户,则可以保存到账户中;如果没有,就保存到文件。这里以保存到文件为例9、将密码保存到该内存卡外的其他盘符上。注意:不能保存到根目录上10、保存完毕之后,可以选择保存到其他位置上,以免丢失,也可以继续操作11、选择需要的加密方式。两种方式都有自己的优点,第一种现在比较快速,但是后期存储会比较慢;第二种现在会比较慢,但之后存储数据会比较快12、选择加密模式。因为是内存卡,所以选择兼容模式,以便在其他电脑上使用13、开始加密。加密完成之后,内存卡就被密码保护了
内存卡被加密怎么解开?
亲,内存卡加密解除具体方法如下1、首先,打开电脑并将SD卡插入到电脑上,在电脑桌面“计算机”上点击鼠标右键打开它2、然后,在“可移动存储的设备”这一栏中,找到SD卡的盘符并用鼠标右击它,选择“属性”这一按钮3、接着,在“属性”中,将卡片由“常规”切换为“工具”,可以发现在这一卡片的第一栏为“查错”栏,选择其中的“开始检查”4、然后,将磁盘检查选项中的“自动修复文件系统错误”,以及其下面的“扫描并尝试恢复坏扇区”勾选,点击“开始”5、接着,等待一段时间后,返回到“计算机”页面,再次寻找到SD卡的盘符,并进行右击选择“格式化”6、最后,在“格式化”这一卡片中的底部,选择“开始”格式化SD卡,SD卡的写保护成功解除【摘要】
内存卡被加密怎么解开?【提问】
亲,内存卡加密解除具体方法如下1、首先,打开电脑并将SD卡插入到电脑上,在电脑桌面“计算机”上点击鼠标右键打开它2、然后,在“可移动存储的设备”这一栏中,找到SD卡的盘符并用鼠标右击它,选择“属性”这一按钮3、接着,在“属性”中,将卡片由“常规”切换为“工具”,可以发现在这一卡片的第一栏为“查错”栏,选择其中的“开始检查”4、然后,将磁盘检查选项中的“自动修复文件系统错误”,以及其下面的“扫描并尝试恢复坏扇区”勾选,点击“开始”5、接着,等待一段时间后,返回到“计算机”页面,再次寻找到SD卡的盘符,并进行右击选择“格式化”6、最后,在“格式化”这一卡片中的底部,选择“开始”格式化SD卡,SD卡的写保护成功解除【回答】
如何安全的存储用户的密码
保护密码最好的的方式就是使用带盐的密码hash(salted password hashing).对密码进行hash操作是一件很简单的事情,但是很多人都犯了错。接下来我希望可以详细的阐述如何恰当的对密码进行hash,以及为什么要这样做。
重要提醒
如果你打算自己写一段代码来进行密码hash,那么赶紧停下吧。这样太容易犯错了。这个提醒适用于每一个人,不要自己写密码的hash算法 !关于保存密码的问题已经有了成熟的方案,那就是使用phpass或者本文提供的源码。
什么是hash
hash("hello") = 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824
hash("hbllo") = 58756879c05c68dfac9866712fad6a93f8146f337a69afe7dd238f3364946366
hash("waltz") = c0e81794384491161f1777c232bc6bd9ec38f616560b120fda8e90f383853542
Hash算法是一种单向的函数。它可以把任意数量的数据转换成固定长度的“指纹”,这个过程是不可逆的。而且只要输入发生改变,哪怕只有一个bit,输出的hash值也会有很大不同。这种特性恰好合适用来用来保存密码。因为我们希望使用一种不可逆的算法来加密保存的密码,同时又需要在用户登陆的时候验证密码是否正确。
在一个使用hash的账号系统中,用户注册和认证的大致流程如下:
1, 用户创建自己的账号
2, 用户密码经过hash操作之后存储在数据库中。没有任何明文的密码存储在服务器的硬盘上。
3, 用户登陆的时候,将用户输入的密码进行hash操作后与数据库里保存的密码hash值进行对比。
4, 如果hash值完全一样,则认为用户输入的密码是正确的。否则就认为用户输入了无效的密码。
5, 每次用户尝试登陆的时候就重复步骤3和步骤4。
在步骤4的时候不要告诉用户是账号还是密码错了。只需要显示一个通用的提示,比如账号或密码不正确就可以了。这样可以防止攻击者枚举有效的用户名。
还需要注意的是用来保护密码的hash函数跟数据结构课上见过的hash函数不完全一样。比如实现hash表的hash函数设计的目的是快速,但是不够安全。只有加密hash函数(cryptographic hash functions)可以用来进行密码的hash。这样的函数有SHA256, SHA512, RipeMD, WHIRLPOOL等。
一个常见的观念就是密码经过hash之后存储就安全了。这显然是不正确的。有很多方式可以快速的从hash恢复明文的密码。还记得那些md5破解网站吧,只需要提交一个hash,不到一秒钟就能知道结果。显然,单纯的对密码进行hash还是远远达不到我们的安全需求。下一部分先讨论一下破解密码hash,获取明文常见的手段。
如何破解hash
字典和暴力破解攻击(Dictionary and Brute Force Attacks)
最常见的破解hash手段就是猜测密码。然后对每一个可能的密码进行hash,对比需要破解的hash和猜测的密码hash值,如果两个值一样,那么之前猜测的密码就是正确的密码明文。猜测密码攻击常用的方式就是字典攻击和暴力攻击。
Dictionary Attack
Trying apple : failed
Trying blueberry : failed
Trying justinbeiber : failed
...
Trying letmein : failed
Trying s3cr3t : success!
字典攻击是将常用的密码,单词,短语和其他可能用来做密码的字符串放到一个文件中,然后对文件中的每一个词进行hash,将这些hash与需要破解的密码hash比较。这种方式的成功率取决于密码字典的大小以及字典的是否合适。
Brute Force Attack
Trying aaaa : failed
Trying aaab : failed
Trying aaac : failed
...
Trying acdb : failed
Trying acdc : success!
暴力攻击就是对于给定的密码长度,尝试每一种可能的字符组合。这种方式需要花费大量的计算机时间。但是理论上只要时间足够,最后密码一定能够破解出来。只是如果密码太长,破解花费的时间就会大到无法承受。
目前没有方式可以阻止字典攻击和暴力攻击。只能想办法让它们变的低效。如果你的密码hash系统设计的是安全的,那么破解hash唯一的方式就是进行字典或者暴力攻击了。
查表破解(Lookup Tables)
对于特定的hash类型,如果需要破解大量hash的话,查表是一种非常有效而且快速的方式。它的理念就是预先计算(pre-compute)出密码字典中每一个密码的hash。然后把hash和对应的密码保存在一个表里。一个设计良好的查询表结构,即使存储了数十亿个hash,每秒钟仍然可以查询成百上千个hash。
如果你想感受下查表破解hash的话可以尝试一下在CraskStation上破解下下面的sha256 hash。
c11083b4b0a7743af748c85d343dfee9fbb8b2576c05f3a7f0d632b0926aadfc
08eac03b80adc33dc7d8fbe44b7c7b05d3a2c511166bdb43fcb710b03ba919e7
e4ba5cbd251c98e6cd1c23f126a3b81d8d8328abc95387229850952b3ef9f904
5206b8b8a996cf5320cb12ca91c7b790fba9f030408efe83ebb83548dc3007bd
反向查表破解(Reverse Lookup Tables)
Searching for hash(apple) in users' hash list... : Matches [alice3, 0bob0, charles8]
Searching for hash(blueberry) in users' hash list... : Matches [usr10101, timmy, john91]
Searching for hash(letmein) in users' hash list... : Matches [wilson10, dragonslayerX, joe1984]
Searching for hash(s3cr3t) in users' hash list... : Matches [bruce19, knuth1337, john87]
Searching for hash(z@29hjja) in users' hash list... : No users used this password
这种方式可以让攻击者不预先计算一个查询表的情况下同时对大量hash进行字典和暴力破解攻击。
首先,攻击者会根据获取到的数据库数据制作一个用户名和对应的hash表。然后将常见的字典密码进行hash之后,跟这个表的hash进行对比,就可以知道用哪些用户使用了这个密码。这种攻击方式很有效果,因为通常情况下很多用户都会有使用相同的密码。
彩虹表 (Rainbow Tables)
彩虹表是一种使用空间换取时间的技术。跟查表破解很相似。只是它牺牲了一些破解时间来达到更小的存储空间的目的。因为彩虹表使用的存储空间更小,所以单位空间就可以存储更多的hash。彩虹表已经能够破解8位长度的任意md5hash。彩虹表具体的原理可以参考http://www.project-rainbowcrack.com/
下一章节我们会讨论一种叫做“盐”(salting)的技术。通过这种技术可以让查表和彩虹表的方式无法破解hash。
加盐(Adding Salt)
hash("hello") = 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824
hash("hello" + "QxLUF1bgIAdeQX") = 9e209040c863f84a31e719795b2577523954739fe5ed3b58a75cff2127075ed1
hash("hello" + "bv5PehSMfV11Cd") = d1d3ec2e6f20fd420d50e2642992841d8338a314b8ea157c9e18477aaef226ab
hash("hello" + "YYLmfY6IehjZMQ") = a49670c3c18b9e079b9cfaf51634f563dc8ae3070db2c4a8544305df1b60f007
查表和彩虹表的方式之所以有效是因为每一个密码的都是通过同样的方式来进行hash的。如果两个用户使用了同样的密码,那么一定他们的密码hash也一定相同。我们可以通过让每一个hash随机化,同一个密码hash两次,得到的不同的hash来避免这种攻击。
具体的操作就是给密码加一个随即的前缀或者后缀,然后再进行hash。这个随即的后缀或者前缀成为“盐”。正如上面给出的例子一样,通过加盐,相同的密码每次hash都是完全不一样的字符串了。检查用户输入的密码是否正确的时候,我们也还需要这个盐,所以盐一般都是跟hash一起保存在数据库里,或者作为hash字符串的一部分。
盐不需要保密,只要盐是随机的话,查表,彩虹表都会失效。因为攻击者无法事先知道盐是什么,也就没有办法预先计算出查询表和彩虹表。如果每个用户都是使用了不同的盐,那么反向查表攻击也没法成功。
下一节,我们会介绍一些盐的常见的错误实现。
错误的方式:短的盐和盐的复用
最常见的错误实现就是一个盐在多个hash中使用或者使用的盐很短。
盐的复用(Salt Reuse)
不管是将盐硬编码在程序里还是随机一次生成的,在每一个密码hash里使用相同的盐会使这种防御方法失效。因为相同的密码hash两次得到的结果还是相同的。攻击者就可以使用反向查表的方式进行字典和暴力攻击。只要在对字典中每一个密码进行hash之前加上这个固定的盐就可以了。如果是流行的程序的使用了硬编码的盐,那么也可能出现针对这种程序的这个盐的查询表和彩虹表,从而实现快速破解hash。
用户每次创建或者修改密码一定要使用一个新的随机的盐
短的盐
如果盐的位数太短的话,攻击者也可以预先制作针对所有可能的盐的查询表。比如,3位ASCII字符的盐,一共有95x95x95 = 857,375种可能性。看起来好像很多。假如每一个盐制作一个1MB的包含常见密码的查询表,857,375个盐才是837GB。现在买个1TB的硬盘都只要几百块而已。
基于同样的理由,千万不要用用户名做为盐。虽然对于每一个用户来说用户名可能是不同的,但是用户名是可预测的,并不是完全随机的。攻击者完全可以用常见的用户名作为盐来制作查询表和彩虹表破解hash。
根据一些经验得出来的规则就是盐的大小要跟hash函数的输出一致。比如,SHA256的输出是256bits(32bytes),盐的长度也应该是32个字节的随机数据。
错误的方式:双重hash和古怪的hash函数
这一节讨论另外一个常见的hash密码的误解:古怪的hash算法组合。人们可能解决的将不同的hash函数组合在一起用可以让数据更安全。但实际上,这种方式带来的效果很微小。反而可能带来一些互通性的问题,甚至有时候会让hash更加的不安全。本文一开始就提到过,永远不要尝试自己写hash算法,要使用专家们设计的标准算法。有些人会觉得通过使用多个hash函数可以降低计算hash的速度,从而增加破解的难度。通过减慢hash计算速度来防御攻击有更好的方法,这个下文会详细介绍。
下面是一些网上找到的古怪的hash函数组合的样例。
md5(sha1(password))
md5(md5(salt) + md5(password))
sha1(sha1(password))
sha1(str_rot13(password + salt))
md5(sha1(md5(md5(password) + sha1(password)) + md5(password)))
不要使用他们!
注意:这部分的内容其实是存在争议的!我收到过大量邮件说组合hash函数是有意义的。因为如果攻击者不知道我们用了哪个函数,就不可能事先计算出彩虹表,并且组合hash函数需要更多的计算时间。
攻击者如果不知道hash算法的话自然是无法破解hash的。但是考虑到Kerckhoffs’s principle,攻击者通常都是能够接触到源码的(尤其是免费软件和开源软件)。通过一些目标系统的密码–hash对应关系来逆向出算法也不是非常困难。
如果你想使用一个标准的”古怪”的hash函数,比如HMAC,是可以的。但是如果你的目的是想减慢hash的计算速度,那么可以读一下后面讨论的慢速hash函数部分。基于上面讨论的因素,最好的做法是使用标准的经过严格测试的hash算法。
hash碰撞(Hash Collisions)
因为hash函数是将任意数量的数据映射成一个固定长度的字符串,所以一定存在不同的输入经过hash之后变成相同的字符串的情况。加密hash函数(Cryptographic hash function)在设计的时候希望使这种碰撞攻击实现起来成本难以置信的高。但时不时的就有密码学家发现快速实现hash碰撞的方法。最近的一个例子就是MD5,它的碰撞攻击已经实现了。
碰撞攻击是找到另外一个跟原密码不一样,但是具有相同hash的字符串。但是,即使在相对弱的hash算法,比如MD5,要实现碰撞攻击也需要大量的算力(computing power),所以在实际使用中偶然出现hash碰撞的情况几乎不太可能。一个使用加盐MD5的密码hash在实际使用中跟使用其他算法比如SHA256一样安全。不过如果可以的话,使用更安全的hash函数,比如SHA256, SHA512, RipeMD, WHIRLPOOL等是更好的选择。
正确的方式:如何恰当的进行hash
这部分会详细讨论如何恰当的进行密码hash。第一个章节是最基础的,这章节的内容是必须的。后面一个章节是阐述如何继续增强安全性,让hash破解变得异常困难。
基础:使用加盐hash
我们已经知道恶意黑客可以通过查表和彩虹表的方式快速的获得hash对应的明文密码,我们也知道了通过使用随机的盐可以解决这个问题。但是我们怎么生成盐,怎么在hash的过程中使用盐呢?
盐要使用密码学上可靠安全的伪随机数生成器(Cryptographically Secure Pseudo-Random Number Generator (CSPRNG))来产生。CSPRNG跟普通的伪随机数生成器比如C语言中的rand(),有很大不同。正如它的名字说明的那样,CSPRNG提供一个高标准的随机数,是完全无法预测的。我们不希望我们的盐能够被预测到,所以一定要使用CSPRNG。
如何安全地存储密码
保护密码最好的的方式就是使用带盐的密码hash(salted password hashing).对密码进行hash操作是一件很简单的事情,但是很多人都犯了错。接下来我希望可以详细的阐述如何恰当的对密码进行hash,以及为什么要这样做。
重要提醒
如果你打算自己写一段代码来进行密码hash,那么赶紧停下吧。这样太容易犯错了。这个提醒适用于每一个人,不要自己写密码的hash算法 !关于保存密码的问题已经有了成熟的方案,那就是使用phpass或者本文提供的源码。
什么是hash
hash("hello") = 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824
hash("hbllo") = 58756879c05c68dfac9866712fad6a93f8146f337a69afe7dd238f3364946366
hash("waltz") = c0e81794384491161f1777c232bc6bd9ec38f616560b120fda8e90f383853542
Hash算法是一种单向的函数。它可以把任意数量的数据转换成固定长度的“指纹”,这个过程是不可逆的。而且只要输入发生改变,哪怕只有一个bit,输出的hash值也会有很大不同。这种特性恰好合适用来用来保存密码。因为我们希望使用一种不可逆的算法来加密保存的密码,同时又需要在用户登陆的时候验证密码是否正确。
在一个使用hash的账号系统中,用户注册和认证的大致流程如下:
1, 用户创建自己的账号
2, 用户密码经过hash操作之后存储在数据库中。没有任何明文的密码存储在服务器的硬盘上。
3, 用户登陆的时候,将用户输入的密码进行hash操作后与数据库里保存的密码hash值进行对比。
4, 如果hash值完全一样,则认为用户输入的密码是正确的。否则就认为用户输入了无效的密码。
5, 每次用户尝试登陆的时候就重复步骤3和步骤4。
在步骤4的时候不要告诉用户是账号还是密码错了。只需要显示一个通用的提示,比如账号或密码不正确就可以了。这样可以防止攻击者枚举有效的用户名。
还需要注意的是用来保护密码的hash函数跟数据结构课上见过的hash函数不完全一样。比如实现hash表的hash函数设计的目的是快速,但是不够安全。只有加密hash函数(cryptographic hash functions)可以用来进行密码的hash。这样的函数有SHA256, SHA512, RipeMD, WHIRLPOOL等。
一个常见的观念就是密码经过hash之后存储就安全了。这显然是不正确的。有很多方式可以快速的从hash恢复明文的密码。还记得那些md5破解网站吧,只需要提交一个hash,不到一秒钟就能知道结果。显然,单纯的对密码进行hash还是远远达不到我们的安全需求。下一部分先讨论一下破解密码hash,获取明文常见的手段。
如何破解hash
字典和暴力破解攻击(Dictionary and Brute Force Attacks)
最常见的破解hash手段就是猜测密码。然后对每一个可能的密码进行hash,对比需要破解的hash和猜测的密码hash值,如果两个值一样,那么之前猜测的密码就是正确的密码明文。猜测密码攻击常用的方式就是字典攻击和暴力攻击。
Dictionary Attack
Trying apple : failed
Trying blueberry : failed
Trying justinbeiber : failed
...
Trying letmein : failed
Trying s3cr3t : success!
字典攻击是将常用的密码,单词,短语和其他可能用来做密码的字符串放到一个文件中,然后对文件中的每一个词进行hash,将这些hash与需要破解的密码hash比较。这种方式的成功率取决于密码字典的大小以及字典的是否合适。
Brute Force Attack
Trying aaaa : failed
Trying aaab : failed
Trying aaac : failed
...
Trying acdb : failed
Trying acdc : success!
暴力攻击就是对于给定的密码长度,尝试每一种可能的字符组合。这种方式需要花费大量的计算机时间。但是理论上只要时间足够,最后密码一定能够破解出来。只是如果密码太长,破解花费的时间就会大到无法承受。
目前没有方式可以阻止字典攻击和暴力攻击。只能想办法让它们变的低效。如果你的密码hash系统设计的是安全的,那么破解hash唯一的方式就是进行字典或者暴力攻击了。
查表破解(Lookup Tables)
对于特定的hash类型,如果需要破解大量hash的话,查表是一种非常有效而且快速的方式。它的理念就是预先计算(pre-compute)出密码字典中每一个密码的hash。然后把hash和对应的密码保存在一个表里。一个设计良好的查询表结构,即使存储了数十亿个hash,每秒钟仍然可以查询成百上千个hash。
如果你想感受下查表破解hash的话可以尝试一下在CraskStation上破解下下面的sha256 hash。
c11083b4b0a7743af748c85d343dfee9fbb8b2576c05f3a7f0d632b0926aadfc
08eac03b80adc33dc7d8fbe44b7c7b05d3a2c511166bdb43fcb710b03ba919e7
e4ba5cbd251c98e6cd1c23f126a3b81d8d8328abc95387229850952b3ef9f904
5206b8b8a996cf5320cb12ca91c7b790fba9f030408efe83ebb83548dc3007bd
反向查表破解(Reverse Lookup Tables)
Searching for hash(apple) in users' hash list... : Matches [alice3, 0bob0, charles8]
Searching for hash(blueberry) in users' hash list... : Matches [usr10101, timmy, john91]
Searching for hash(letmein) in users' hash list... : Matches [wilson10, dragonslayerX, joe1984]
Searching for hash(s3cr3t) in users' hash list... : Matches [bruce19, knuth1337, john87]
Searching for hash(z@29hjja) in users' hash list... : No users used this password
这种方式可以让攻击者不预先计算一个查询表的情况下同时对大量hash进行字典和暴力破解攻击。
首先,攻击者会根据获取到的数据库数据制作一个用户名和对应的hash表。然后将常见的字典密码进行hash之后,跟这个表的hash进行对比,就可以知道用哪些用户使用了这个密码。这种攻击方式很有效果,因为通常情况下很多用户都会有使用相同的密码。
彩虹表 (Rainbow Tables)
彩虹表是一种使用空间换取时间的技术。跟查表破解很相似。只是它牺牲了一些破解时间来达到更小的存储空间的目的。因为彩虹表使用的存储空间更小,所以单位空间就可以存储更多的hash。彩虹表已经能够破解8位长度的任意md5hash。彩虹表具体的原理可以参考http://www.project-rainbowcrack.com/
下一章节我们会讨论一种叫做“盐”(salting)的技术。通过这种技术可以让查表和彩虹表的方式无法破解hash。
加盐(Adding Salt)
hash("hello") = 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824
hash("hello" + "QxLUF1bgIAdeQX") = 9e209040c863f84a31e719795b2577523954739fe5ed3b58a75cff2127075ed1
hash("hello" + "bv5PehSMfV11Cd") = d1d3ec2e6f20fd420d50e2642992841d8338a314b8ea157c9e18477aaef226ab
hash("hello" + "YYLmfY6IehjZMQ") = a49670c3c18b9e079b9cfaf51634f563dc8ae3070db2c4a8544305df1b60f007
查表和彩虹表的方式之所以有效是因为每一个密码的都是通过同样的方式来进行hash的。如果两个用户使用了同样的密码,那么一定他们的密码hash也一定相同。我们可以通过让每一个hash随机化,同一个密码hash两次,得到的不同的hash来避免这种攻击。
具体的操作就是给密码加一个随即的前缀或者后缀,然后再进行hash。这个随即的后缀或者前缀成为“盐”。正如上面给出的例子一样,通过加盐,相同的密码每次hash都是完全不一样的字符串了。检查用户输入的密码是否正确的时候,我们也还需要这个盐,所以盐一般都是跟hash一起保存在数据库里,或者作为hash字符串的一部分。
盐不需要保密,只要盐是随机的话,查表,彩虹表都会失效。因为攻击者无法事先知道盐是什么,也就没有办法预先计算出查询表和彩虹表。如果每个用户都是使用了不同的盐,那么反向查表攻击也没法成功。
下一节,我们会介绍一些盐的常见的错误实现。
错误的方式:短的盐和盐的复用
最常见的错误实现就是一个盐在多个hash中使用或者使用的盐很短。
盐的复用(Salt Reuse)
不管是将盐硬编码在程序里还是随机一次生成的,在每一个密码hash里使用相同的盐会使这种防御方法失效。因为相同的密码hash两次得到的结果还是相同的。攻击者就可以使用反向查表的方式进行字典和暴力攻击。只要在对字典中每一个密码进行hash之前加上这个固定的盐就可以了。如果是流行的程序的使用了硬编码的盐,那么也可能出现针对这种程序的这个盐的查询表和彩虹表,从而实现快速破解hash。
用户每次创建或者修改密码一定要使用一个新的随机的盐
短的盐
如果盐的位数太短的话,攻击者也可以预先制作针对所有可能的盐的查询表。比如,3位ASCII字符的盐,一共有95x95x95 = 857,375种可能性。看起来好像很多。假如每一个盐制作一个1MB的包含常见密码的查询表,857,375个盐才是837GB。现在买个1TB的硬盘都只要几百块而已。
基于同样的理由,千万不要用用户名做为盐。虽然对于每一个用户来说用户名可能是不同的,但是用户名是可预测的,并不是完全随机的。攻击者完全可以用常见的用户名作为盐来制作查询表和彩虹表破解hash。
根据一些经验得出来的规则就是盐的大小要跟hash函数的输出一致。比如,SHA256的输出是256bits(32bytes),盐的长度也应该是32个字节的随机数据。
错误的方式:双重hash和古怪的hash函数
这一节讨论另外一个常见的hash密码的误解:古怪的hash算法组合。人们可能解决的将不同的hash函数组合在一起用可以让数据更安全。但实际上,这种方式带来的效果很微小。反而可能带来一些互通性的问题,甚至有时候会让hash更加的不安全。本文一开始就提到过,永远不要尝试自己写hash算法,要使用专家们设计的标准算法。有些人会觉得通过使用多个hash函数可以降低计算hash的速度,从而增加破解的难度。通过减慢hash计算速度来防御攻击有更好的方法,这个下文会详细介绍。
下面是一些网上找到的古怪的hash函数组合的样例。
md5(sha1(password))
md5(md5(salt) + md5(password))
sha1(sha1(password))
sha1(str_rot13(password + salt))
md5(sha1(md5(md5(password) + sha1(password)) + md5(password)))
不要使用他们!
注意:这部分的内容其实是存在争议的!我收到过大量邮件说组合hash函数是有意义的。因为如果攻击者不知道我们用了哪个函数,就不可能事先计算出彩虹表,并且组合hash函数需要更多的计算时间。
攻击者如果不知道hash算法的话自然是无法破解hash的。但是考虑到Kerckhoffs’s principle,攻击者通常都是能够接触到源码的(尤其是免费软件和开源软件)。通过一些目标系统的密码–hash对应关系来逆向出算法也不是非常困难。
如果你想使用一个标准的”古怪”的hash函数,比如HMAC,是可以的。但是如果你的目的是想减慢hash的计算速度,那么可以读一下后面讨论的慢速hash函数部分。基于上面讨论的因素,最好的做法是使用标准的经过严格测试的hash算法。
hash碰撞(Hash Collisions)
因为hash函数是将任意数量的数据映射成一个固定长度的字符串,所以一定存在不同的输入经过hash之后变成相同的字符串的情况。加密hash函数(Cryptographic hash function)在设计的时候希望使这种碰撞攻击实现起来成本难以置信的高。但时不时的就有密码学家发现快速实现hash碰撞的方法。最近的一个例子就是MD5,它的碰撞攻击已经实现了。
碰撞攻击是找到另外一个跟原密码不一样,但是具有相同hash的字符串。但是,即使在相对弱的hash算法,比如MD5,要实现碰撞攻击也需要大量的算力(computing power),所以在实际使用中偶然出现hash碰撞的情况几乎不太可能。一个使用加盐MD5的密码hash在实际使用中跟使用其他算法比如SHA256一样安全。不过如果可以的话,使用更安全的hash函数,比如SHA256, SHA512, RipeMD, WHIRLPOOL等是更好的选择。
正确的方式:如何恰当的进行hash
这部分会详细讨论如何恰当的进行密码hash。第一个章节是最基础的,这章节的内容是必须的。后面一个章节是阐述如何继续增强安全性,让hash破解变得异常困难。
基础:使用加盐hash
我们已经知道恶意黑客可以通过查表和彩虹表的方式快速的获得hash对应的明文密码,我们也知道了通过使用随机的盐可以解决这个问题。但是我们怎么生成盐,怎么在hash的过程中使用盐呢?
盐要使用密码学上可靠安全的伪随机数生成器(Cryptographically Secure Pseudo-Random Number Generator (CSPRNG))来产生。CSPRNG跟普通的伪随机数生成器比如C语言中的rand(),有很大不同。正如它的名字说明的那样,CSPRNG提供一个高标准的随机数,是完全无法预测的。我们不希望我们的盐能够被预测到,所以一定要使用CSPRNG。
秘密级国家秘密载体应当存放在什么当中
秘密级国家秘密载体应当存放在密码文件柜当中。国家保密行政管理部门主管全国的保密工作,县级以上地方各级保密行政管理部门主管本行政区域的保密工作。机关、单位执行上级确定的国家秘密事项,需要定密的,根据所执行的国家秘密事项的密级确定。下级机关、单位认为本机关、本单位产生的有关定密事项属于上级机关、单位的定密权限,应当先行采取保密措施,并立即报请上级机关、单位确定。没有上级机关、单位的,应当立即提请有相应定密权限的业务主管部门或者保密行政管理部门确定。法律依据《中华人民共和国保守国家秘密法》第九条 下列涉及国家安全和利益的事项,泄露后可能损害国家在政治、经济、国防、外交等领域的安全和利益的,应当确定为国家秘密:(一)国家事务重大决策中的秘密事项;(二)国防建设和武装力量活动中的秘密事项;(三)外交和外事活动中的秘密事项以及对外承担保密义务的秘密事项;(四)国民经济和社会发展中的秘密事项;(五)科学技术中的秘密事项;(六)维护国家安全活动和追查刑事犯罪中的秘密事项;(七)经国家保密行政管理部门确定的其他秘密事项。政党的秘密事项中符合前款规定的,属于国家秘密。第十五条 国家秘密的保密期限,应当根据事项的性质和特点,按照维护国家安全和利益的需要,限定在必要的期限内;不能确定期限的,应当确定解密的条件。国家秘密的保密期限,除另有规定外,绝密级不超过三十年,机密级不超过二十年,秘密级不超过十年。机关、单位应当根据工作需要,确定具体的保密期限、解密时间或者解密条件。机关、单位对在决定和处理有关事项工作过程中确定需要保密的事项,根据工作需要决定公开的,正式公布时即视为解密。
存储过国家秘密的涉密存储介质不能
存储过国家秘密的涉密存储介质不能解除。什么是涉密计算机及涉密存储介质运用采集、加工、存储、传输、检索等功能,处理涉及国家秘密信息的计算机通常称为涉密计算机。涉密移动存储介质主要是指用于记录、存储、拷贝国家秘密信息的移动硬盘、软盘、磁带、光盘、优盘、存储卡等磁、光及半导体介质载体。存有涉密信息的存储介质不得接入或安装在非涉密计算机或低密级的计算机上。涉密存储介质必须根据密级存储在相应的保密设施里。涉密存储介质应根据需存储的涉密内容,标明相应的密级。严禁高密级的移动存储介质在低密级计算机上使用;
数据加密是保护数据安全的常用方法
企业/公司电脑核心文件数据自动智能透明加密技术(支持任意类型文件、文档、图纸、代码、音视频等等)不改变原有操作、交互,支持主流操作系统所谓透明,是指对使用者来说是未知的。当使用者在打开或编辑指定文件时,系统将自动对未加密的文件进行加密,对已加密的文件自动解密。文件在硬盘上是密文,在内存中是明文。一旦离开使用环境,由于应用程序无法得到自动解密的服务而无法打开,从而起来保护文件内容的效果。特点强制加密:安装系统后,所有指定类型文件都是强制加密的;使用方便:不影响原有操作习惯,不需要限止端口;于内无碍:内部交流时不需要作任何处理便能交流;对外受阻:一旦文件离开使用环境,文件将自动失效,从而保护知识产权。透明加密技术是与驱动层内核紧密结合的一种技术,它工作于操作系统 的底层。通过监控应用程序对文件的操作,在打开文件时自动对密文进行解密,在写文件时自动将内存中的明文加密写入存储介质。从而保证存储介质上的文件始终处于加密状态。
安全存储的加密和认证是安全存储的基础
从原理上来说,安全存储要解决的问题是两个,如何保证文件数据完整可靠不泄密?如何保证只有合法的用户,才能够访问相关的文件?解决上述两个问题,需要使用数据加密和认证授权管理技术,这也是安全存储的核心技术。在安全存储中,利用技术手段把文件变为乱码(加密)存储,在使用文件的时候,用相同或不同的手段还原(解密)。这样,存储和使用,文件就在密文和明文状态两种方式切换。既保证了安全,又能够方便的使用。加密包括两个元素:算法和密钥对数据加密的技术分为两类,即对称加密(私人密钥加密)和非对称加密(公开密钥加密)。对称加密以数据加密标准(DES,Data Encryption Standard)算法为典型代表,非对称加密通常以RSA(Rivest Shamir Ad1eman)算法为代表。对称加密的加密密钥和解密密钥相同,而非对称加密的加密密钥和解密密钥不同,加密密钥可以公开而解密密钥需要保密。一般来说,非对称密钥主要用于身份认证,或者保护对称密钥。而日常的数据加密,一般都使用对称密钥。现代的成熟加密解密算法,都具有可靠的加密强度,除非能够持有正确的密钥,否则很难强行破解。在安全存储产品实际部署的时候,如果需要更高强度的身份认证,还可以使用U-key,这种认证设备,在网上银行应用很普遍。采用加密和身份认证技术,存储就有了可靠的保障。