我对消息摘要的理解是,它是与加密数据一起发送的一些数据的加密散列,因此您可以验证数据是否未被篡改.这与消息认证码(MAC)和散列MAC(HMAC)之间有什么区别?
所以阅读这篇文章:如何在Android中计算字符串的SHA-256哈希值?
和文档:http://developer.android.com/reference/java/security/MessageDigest.html
我很好奇; 哪些手机支持SHA-256?在文档中,关于'NoSuchAlgorithmException'的一行让我觉得有些手机不支持所有算法.在我为一个应用程序实现这个并期望它在所有手机上工作之前我想知道如果有人知道这个...?
我觉得奇怪的是MessageDigest类没有一些常量来选择你想要使用的算法.
我需要在性能关键环境中使用MessageDigest从多个线程中散列多个键.我开始知道MessageDigest不是线程安全的,因为它将状态存储在它的对象中.什么是实现密钥线程安全散列的最佳方法?
使用案例:
MessageDigest messageDigest = MessageDigest.getInstance("SHA-1");
//somewhere later, just need to hash a key, nothing else
messageDigest.update(key);
byte[] bytes = messageDigest.digest();
Run Code Online (Sandbox Code Playgroud)
特别:
我的用例非常简单 - 只需哈希一个简单的密钥.我不能使用同步.
谢谢,
使用像SHA-256这样的安全散列函数是微不足道的,并且继续使用MD5来实现安全性是鲁莽的行为.但是,我希望更好地理解哈希函数漏洞的一些复杂性.
已经为MD4和MD5生成了碰撞.根据NIST,MD5不是安全散列函数.生成冲突只需要2 39次操作,绝不能用于密码.然而,SHA-1很容易受到类似的碰撞攻击,其中可以在2 69次操作中发现碰撞,而蛮力是2 80.没有人生成SHA-1冲突,NIST仍然将SHA-1列为安全消息摘要功能.
那么什么时候使用破坏的哈希函数是安全的呢?即使功能被破坏,它仍然可以"足够大".根据Schneier的说法,易受冲突攻击的哈希函数仍然可以用作HMAC.我相信这是因为HMAC的安全性取决于其密钥,并且在获得此密钥之前无法找到冲突.一旦你在HMAC中使用了密钥,它就已经坏了,所以这是一个没有实际意义的问题.哈希函数漏洞会破坏HMAC的安全性?
让我们进一步了解这个属性.如果密码前面加盐,那么使用像MD4这样的非常弱的消息摘要是否可以安全地使用密码?请记住,MD4和MD5攻击是攻击前缀,如果预先添加了盐,则攻击者无法控制消息的前缀.如果盐真的是一个秘密,并且攻击者不知道,那么它是否附加在密码上是否重要?假设攻击者在获得整个消息之前无法生成冲突,这是否安全?
您是否知道在不引入漏洞的情况下可以在安全上下文中使用损坏的哈希函数的其他情况?
(请发布支持证据,因为它很棒!)
在Java中,如果我想计算MD5总和,我需要知道可能的异常:
try {
MessageDigest md = MessageDigest.getInstance("MD5");
// Do stuff
} catch (NoSuchAlgorithmException e) {
// Can't happen...
}
Run Code Online (Sandbox Code Playgroud)
但是,根据JVM规范,必须支持MD5,因此永远不应抛出异常.是否有不同的访问模式允许我编写更优雅的代码?
我正在使用java消息摘要来创建MD5哈希,用于身份验证.MD5哈希作为varchar2存储在数据库中.我做了一个测试,在我的本地笔记本电脑上的tomcat服务器上创建用户.当我将战争部署到linux redhat上的测试tomcat服务器时,由于哈希不匹配,身份验证失败.我检查了用户名和密码:它们都是正确的.两个Web服务器都指向同一个数据库.
我怀疑在我的本地笔记本电脑上生成的哈希值与测试服务器生成的哈希值不同.我对吗?
下面是我生成哈希的代码.
public static String getMD5Hash(String str) throws Exception
{
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(str.getBytes());
return new String(md.digest());
}
Run Code Online (Sandbox Code Playgroud)
返回的String将保存在数据库表中,该表定义如下
create table authen(
passport varchar2(50),
constraint pk_au primary key (passport) USING INDEX TABLESPACE xxxxxxx
);
Run Code Online (Sandbox Code Playgroud)
这是我笔记本电脑上的java版本输出
C:\Users\XXXX>java -version
java version "1.6.0_25"
Java(TM) SE Runtime Environment (build 1.6.0_25-b06)
Java HotSpot(TM) Client VM (build 20.0-b11, mixed mode, sharing)
Run Code Online (Sandbox Code Playgroud)
这是redhat服务器上的java版本输出
[xxxxxx@xxxxxxxxx ~]$ java -version
java version "1.6.0_20"
Java(TM) SE Runtime Environment (build 1.6.0_20-b02)
Java HotSpot(TM) Client VM (build 16.3-b01, mixed mode, …
Run Code Online (Sandbox Code Playgroud) 我们试图避免保存重复的文件.但是,我们的md5结果总是与BlobInfo不同.
我们如何计算它:
MessageDigest messageDigest = java.security.MessageDigest.getInstance("MD5");
digest = messageDigest.digest(bytes);
String digestString = DigestUtils.md5Hex(digest);
Run Code Online (Sandbox Code Playgroud)
它不符合: (new BlobInfoFactory().loadBlobInfo(blobKey)).getMd5Hash();
示例不匹配:
google vs my own calculation:
8cdeb6db94bc4fd156e2975fd8ebbcf2 vs 9003b37afbf3637de96c35774069453f
65a25dafcba58d16d58a9c7585cc3932 vs 52383159f7d27417d50121aaee2728b5
5cccc2d690fdc0c254234d5526876b34 vs 8196da9b6733daa60e08d927693df483
Run Code Online (Sandbox Code Playgroud)
它在生产服务器上.(我们没有测试开发环境)
google-app-engine md5 duplicate-removal message-digest blobstore
无论输入如何(即 MD5 >> 128 位,SHA-256 >> 256 位),哈希函数总是产生固定长度的输出,但为什么呢?
我知道这是设计师设计它们的方式,但为什么他们将输出设计为具有相同的长度?以便它可以以一致的方式存储?比较容易比较?不那么复杂?
我想知道在我直截了当地忽略MessageDigest.getInstance("MD5")
可以抛出的已检查异常之前,MD5摘要算法是否保证在所有Android设备中都可用.
这到底是做什么的?我试着查一下但没找到任何东西.
询问的原因是我想将SALT byte[]
合并到一个随后进行散列的值中.所以它应该像这样(伪代码):
MessageDigest.update(SALT);
MessageDigest.update(value);
digestValue = MessageDigest.digest();
// Where SALT, value and digestValue are array bytes, byte[]
Run Code Online (Sandbox Code Playgroud)
这是否同时添加SALT
和value
最终摘要,还是应该将两个变量合并为一个然后再合并update
一次?
我在任何文件中都找不到答案,任何澄清都将不胜感激.
谢谢,干杯.
message-digest ×10
hash ×4
java ×4
android ×3
md5 ×3
security ×2
algorithm ×1
blobstore ×1
cryptography ×1
hmac ×1
performance ×1
salt ×1
sha ×1