我看到术语"八位"在文学弹出约随机数的散列,它似乎是"性格"的代名词,虽然是一种模式的话是如何使用的.
这让我相信两者之间存在正式的区别.如果有人能够告诉我它是什么,我会很感激.
(请不要,关于八进制字符代码或八进制(基数8)数字的讲座;我在谈论名词 '八位字节',而不是形容词)
编辑:事实证明,我正在寻找的词是"八位字节".
我正在做一些研究或谷歌搜索处理密码散列和盐析的不同方法,并遇到了这个有趣的链接:
现在,基本上建议的是创建两个用户函数,一个用于散列,另一个用于检查散列.
盐是伪随机的,但实际上是基于密码(让我感觉不好?).
散列函数也伪随机地"散布"哈希字符串中的盐.
哈希检查功能反转盐洒,然后进行实际的哈希检查.
现在,我知道每个密码哈希的唯一salt =好,但是具有散列密码并创建存储在db函数中的salt的逻辑可能=坏.
我喜欢盐不明显的想法,它也不需要基于一些有希望的一致性值,如用户名,用户ID,出生日期等,但正如我所说,我确实对实现有疑问.
那么,人们对"最佳方法解决方案"的看法和想法是什么?
所以这基本上是一种保证,就哈希/腌制而言,我正在进行整个注册/登录过程.
我有一个用户表,其中包含字段密码,盐,令牌(显然还有其他但这是最重要的).注册后,它会生成一个随机盐和一个随机令牌,并在密码字段中输入:
hash("sha256", $theirpostpassword.$randomgeneratedsalt);
Run Code Online (Sandbox Code Playgroud)
随机生成的salt和令牌存储在表中该用户行的各自字段中.
因此,在登录时,我只使用他们指定的用户名从用户行中选择salt.然后我做一个计数查询,查看有多少行的帖子密码与他们的特定盐连接,然后我将它们登录.很确定我有那个部分.
现在我想在每个页面上验证他们的登录我会在每个页面上运行一个函数来检查他们的cookie,看看id-username-token的格式是否与数据库中的行匹配.这意味着每次登录都会使用这些凭据设置cookie.
现在,我能想到的唯一能让它变得更好的是每次有效登录都会更改令牌吗?
感谢有识之士.
我想在我正在处理的网站上添加密码salting,我发现Spring Security 3.1有一些新功能可以让它变得非常容易.
我有一个关于StandardPasswordEncoder类的问题.它的运作方式与我的预期略有不同.使用它比编写盐腌自己看起来更简单,但我认为还有一些我不明白的"魔法".
StandardPasswordEncoder似乎为我随机加盐,这很好.但是在将原始密码与编码密码相匹配时......如何在不知道原始盐是什么的情况下才能匹配密码?
根据我的理解,一旦你制作了盐,你就不能回去......所以如果首先有一个随机的盐来生成编码的哈希值......那么StandardPasswordEncoder如何能够在以后匹配密码点?我很迷惑.我不应该得到盐,将盐保存在数据库中,然后供应盐?没有我存储和提供盐值,它怎么能做到这一点?
谢谢你清理混乱.我希望我的问题有道理.
我正在我的Android应用程序中实现许可,并且需要将20个字节的数组传递到传递给ServerManagedPolicy对象的AESObfuscator.每次运行代码时都可以随机生成此数组,还是必须进行硬编码?
现在我随机生成这样的盐:
private static final byte[] SALT;
static {
Random random = new Random();
random.setSeed(System.currentTimeMillis());
byte[] buf = new byte[20];
random.nextBytes(buf);
SALT = buf;
}
Run Code Online (Sandbox Code Playgroud) 我正在编写一个Android应用程序,旨在使用AES 256加密和解密文件.我使用AES-CBC模式和PBKDF2从用户输入的密码中导出AES密钥.此外,我正在为每个文件的加密密钥生成一个安全的伪随机盐.我将IV和salt与加密文件一起存储,因此我可以重新读取它们并稍后重新生成密钥以便能够解密文件.
我的问题:将盐与加密文件一起存储会破坏安全性和盐本身的任何含义吗?知道盐和IV的攻击者不能对加密文件进行离线暴力攻击以找出加密密钥吗?
我正在尝试测试PBE加密/解密.我发现PBE生成具有不同盐和迭代计数的相同密钥.当然,使用的密码是相同的.据我所知,相同的密码和不同的salt/iteration应该得到不同的密钥.以下是我的测试代码:
import java.security.Key;
import java.security.SecureRandom;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;
public class PBETest
{
public static void main(String[] args)
throws Exception
{
String algo = "PBEWithSHA1andDESede";
System.out.println("====== " + algo + " ======");
char[] password = "password".toCharArray();
SecureRandom rand = new SecureRandom();
byte[] salt = new byte[32];
rand.nextBytes(salt);
int iterationCount = rand.nextInt(2048);
//encryption key
PBEKeySpec encPBESpec = new PBEKeySpec(password, salt, iterationCount);
SecretKeyFactory encKeyFact = SecretKeyFactory.getInstance(algo);
Key encKey = encKeyFact.generateSecret(encPBESpec);
System.out.println("encryptioin iteration: " + iterationCount);
//decryption key
rand.nextBytes(salt);
iterationCount = rand.nextInt(2048);
PBEKeySpec …Run Code Online (Sandbox Code Playgroud) 我负责在.Net MVC 4 Web应用程序中进行身份验证,我遇到了关于密码散列,存储和身份验证的问题.
计划是当前使用2 Salts,1 Dynamic(每用户)和1 Static(Web App Constant)和强Hashing功能.
给定一个包含用户名和密码的简单User表:
我担心的是,通过这样做,我将不得不使用其用户名从Web应用程序内存中的数据库中获取用户.是否存在可能存在问题的某种攻击?理想情况下,我希望这是一步/一SQL请求身份验证.
我担心太多了吗?是否可以替代"每用户"盐,我仍然可以进行一步验证?
这到底是做什么的?我试着查一下但没找到任何东西.
询问的原因是我想将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一次?
我在任何文件中都找不到答案,任何澄清都将不胜感激.
谢谢,干杯.
我对密码学很陌生,但学习.我已经从我的在线研究中拼凑了许多不同的建议,并且已经创建了我自己的类来处理相关数据的哈希,盐,键拉伸和比较/转换.
在研究了用于加密的内置.NET库之后,我发现我所拥有的只是SHA-1.但是我得出结论,因为我正在使用散列过程的多次迭代,所以它并不坏.那是对的吗?
但如果我想从更强大的SHA-512开始,我怎么能在下面的代码中实现它?提前致谢.
using System;
using System.Runtime.InteropServices;
using System.Security;
using System.Security.Cryptography;
public class CryptoSaltAndHash
{
private string strHash;
private string strSalt;
public const int SaltSizeInBytes = 128;
public const int HashSizeInBytes = 1024;
public const int Iterations = 3000;
public string Hash { get { return strHash; } }
public string Salt { get { return strSalt; } }
public CryptoSaltAndHash(SecureString ThisPassword)
{
byte[] bytesSalt = new byte[SaltSizeInBytes];
using (RNGCryptoServiceProvider crypto = new RNGCryptoServiceProvider())
{
crypto.GetBytes(bytesSalt);
}
strSalt = Convert.ToBase64String(bytesSalt); …Run Code Online (Sandbox Code Playgroud)