我正在寻找本机MD5或SHA1库的ac#wrapper来提高哈希计算性能.
之前我将SharpZipLib切换到zlib,性能提升超过2倍.(好吧,你要注意你有正确的zlib.so或zlib.dll,具体取决于操作系统和硬件,但它会得到回报).
是否值得MD5或SHA1,或者.NET和Mono都依赖本机实现?
(已编辑)另外:如果我要坚持使用MD5CryptoServiceProvider,有没有一种方法可以在我阅读时计算文件的哈希值?我的意思是,以块的形式发送字节但仍然计算整个哈希值?
我们要求在文件中读/写超过1000万个字符串.此外,我们不希望文件中有重复项.由于字符串在读取后会立即刷新到文件中,因此我们不会将其保留在内存中.
我们不能使用哈希码,因为哈希码中的冲突导致我们可能会错过字符串作为重复.我在谷歌搜索中找到的另外两种方法:
1.使用消息摘要算法,如MD5 - 但计算和存储可能成本太高.
2.使用校验和算法.[我不确定这是否会产生一个字符串的唯一键 - 有人可以确认]
是否有任何其他方法可用.谢谢.
我对加密/散列知之甚少.
我必须哈希加密密钥.Java中的例子是这样的......
String encryptionKey = "test";
MessageDigest messageDigest = MessageDigest.getInstance("MD5");
messageDigest.update(encryptionKey.getBytes("UTF-8"), 0, encryptionKey.length());
byte[] encryptionKeyBytes = messageDigest.digest();
Run Code Online (Sandbox Code Playgroud)
如果我错了,现在纠正我,但上面的代码用MD5算法对字符串进行哈希处理.
当我在C#中散列相同的字符串时,我想要相同的结果.
我目前的C#代码看起来像这样......
string encryptionKey = "test";
var md5 = MD5.Create();
var keyBytes = Encoding.UTF8.GetBytes(encryptionKey);
byte[] encryptionKeyBytes = md5.ComputeHash(keyBytes);
Run Code Online (Sandbox Code Playgroud)
但结束字节结果不匹配.
Java得到......
[0] 9
[1] -113
[2] 107
[3] -51
[4] 70
[5] 33
[6] -45
[7] 115
[8] -54
[9] -34
[10] 78
[11] -125
[12] 38
[13] 39
[14] -76
[15] -10
Run Code Online (Sandbox Code Playgroud)
C#得到......
[0] 9 byte
[1] 143 byte
[2] 107 byte …Run Code Online (Sandbox Code Playgroud) 在使用 wildfly 8.2 和 Java 1.7 的生产环境中,我遇到了一个非常奇怪的情况。
情况是,当服务器启动超过 2 周时,登录性能开始下降。我一直在寻找可能表明问题出在哪里的线索。然后经过一些测试,我得出的结论是,问题在于明文插入的密码被加密以与已插入的密码进行比较。
当加密密码的函数被执行时,它需要将近 2 分钟,但是当服务器重新启动时,同样的执行时间不到 30 秒。
加密使用 java.security.MessageDigest 生成哈希。具体使用 SHA-256 迭代 50000 次。知道为什么这个过程会随着时间变慢吗?我正在使用 /dev/urandom 来生成随机数,所以这应该不是问题。
下面是函数代码:
protected byte[] hash(byte[] bytes, byte[] salt, int hashIterations) throws UnknownAlgorithmException {
MessageDigest digest = getDigest(getAlgorithmName());
if (salt != null) {
digest.reset();
digest.update(salt);
}
byte[] hashed = digest.digest(bytes);
int iterations = hashIterations - 1; //already hashed once above
//iterate remaining number:
for (int i = 0; i < iterations; i++) {
digest.reset();
hashed = digest.digest(hashed);
} …Run Code Online (Sandbox Code Playgroud) 我试图了解需要在Web应用程序中发送哪些信息.基本上我有一个在Web服务器上运行的Web应用程序,一个数据库,其中包含带有哈希密码和salt的用户表,当然还有启用了javascript的Web客户端.
当用户登录登录时,在客户端输入用户名和密码.我想知道发送了什么信息.Web客户端是否以纯文本形式发送了密码,或者是否使用javascript来散列密码而没有盐并发送了hased结果?或者客户端是否从服务器获取纯文本的盐,然后客户端发送了密码+盐?
哈希和哈希哈希的最佳方法是什么?哈希是否可以将MD5作为哈希?hash(password_plain_text + salt)与hash(hash(password_plain_text)+ salt)有何关系,其中+是字符串连接?
我盲目地遵循了OWASP关于java中哈希生成的建议(见这里),我不确定我是否已经正确地完成了它.具体来说,我不确定其用途和效果MessageDigest.reset(),以及何时以及如何使用它.
update()摘要多次使用不同的值来"加载"我的盐和有效负载,这些值完全需要签名.我应该reset()事先消化吗?还是之后呢?reset()在循环内(参见示例)?这是我的代码:
MessageDigest md = MessageDigest.getInstance("SHA-256");
md.update(salt);
md.update(payload1); // part 1 of payload
md.update(payload2); // part 2 of payload
md.update(serialNumber); // part 3 of payload
md.reset();
byte[] sig = md.digest();
for (int i=0; i<1000; i++) {
md.reset();
sig = md.digest(sig);
}
Run Code Online (Sandbox Code Playgroud)
我所观察到的是即使在serialNumber变化时签名仍然保持不变.如果我省略'reset()'调用,sig确实会改变...
我正在使用消息摘要,我看到它有时与 salt
synchronized (hasher) {
hasher.update(salt); // "Updates" the digest using the specified byte.
salt++;
digest = hasher.digest(data); // Final "updates" on the digest using the specified array of bytes, then "completes" the digest computation.
}
Run Code Online (Sandbox Code Playgroud)
有时不加盐:
md.update(data);
byte[] toChapter1Digest = md.digest();
Run Code Online (Sandbox Code Playgroud)
现在,我应该何时使用摘要,salt而不应该使用?我得出的简要研究结论是,每当涉及密码元素时,都会使用盐。
我正在尝试将字符串列表中的两个字符串转换为 MD5 消息摘要。
我的字符串列表称为“用户名密码”。
try {
MessageDigest mdg = MessageDigest.getInstance("MD5");
mdg.update(usernamepassword.get(0).getBytes(), 0, usernamepassword.get(0).length());
mdg.update(usernamepassword.get(1).getBytes(), 1, usernamepassword.get(0).length());
} catch (NoSuchAlgorithmException ex) {
Logger.getLogger(UPCheck.class.getName()).log(Level.SEVERE, null, ex);
}
Run Code Online (Sandbox Code Playgroud)
我的问题是 -
答: 这是正确的做法吗?B:我该如何返回它,以便我可以在另一个类中使用每个单独的 MD5 哈希值?
我编写了一种方法,使用MD5算法将纯文本转换为哈希码.请找到我使用的下面的代码.
public static String convertToMD5Hash(final String plainText){
MessageDigest messageDigest = null;
try {
messageDigest = MessageDigest.getInstance("MD5");
} catch (NoSuchAlgorithmException e) {
LOGGER.warn("For some wierd reason the MD5 algorithm was not found.", e);
}
messageDigest.reset();
messageDigest.update(plainText.getBytes());
final byte[] digest = messageDigest.digest();
final BigInteger bigInt = new BigInteger(1, digest);
String hashtext = bigInt.toString(8);
return hashtext;
}
Run Code Online (Sandbox Code Playgroud)
此方法完美地工作但它返回一个冗长的哈希.我需要将此哈希文本限制为8个字符.是否有可能在Java中设置哈希码的长度?
我想使用SHA-256算法在数据库中加密密码.我已经做了一些研究,我发现我应该使用MessageDigest类来正确加密字符串对象.问题是如何恢复哈希函数以恢复原始密码?我的意思是如果我要创建一个登录系统,我必须能够恢复到原来的密码,或者可能不是?也许当密码填写到表单中时,必须将其转换为哈希函数并与存储在数据库中的哈希字符串进行比较,对吧?
我正在尝试使用支持MD5的Java Card对8字节消息(可能需要将其放大到128)进行哈希处理。这是我的源代码:
package net.sourceforge.globalplatform.jc.helloworld;
import javacard.framework.*;
import javacard.security.*;
import javacardx.crypto.Cipher;
import javax.print.attribute.standard.MediaSize;
import java.util.logging.Level;
public class HelloWorldApplet extends Applet {
final static byte APPLET_CLA = (byte)0x80;
final static byte HASH = (byte)0x05;
public static byte[] Message;
MessageDigest mDig = MessageDigest.getInstance(MessageDigest.ALG_MD5, true);
public static void install(byte[] bArray, short bOffset, byte bLength)
{
Message = new byte[256];
new HelloWorldApplet().register(bArray, (short) (bOffset + 1), bArray[bOffset]);
}
public void process(APDU apdu)
{
if (selectingApplet())
{
return;
}
byte[] buffer = apdu.getBuffer();
if (buffer[ISO7816.OFFSET_CLA] == …Run Code Online (Sandbox Code Playgroud) message-digest ×11
java ×8
md5 ×4
hash ×3
algorithm ×2
c# ×2
apdu ×1
checksum ×1
encryption ×1
hashcode ×1
javacard ×1
javascript ×1
key ×1
owasp ×1
performance ×1
salt ×1
security ×1
sha ×1
smartcard ×1
wildfly ×1