我试图使用带有AES的IV,以便加密的文本是不可预测的.但是,加密的十六进制字符串始终相同.
我实际上尝试了一些尝试通过将一些额外的参数传递给cipher init调用来添加一些随机性的方法:
1)手动IV生成
byte[] iv = generateIv();
IvParameterSpec ivspec = new IvParameterSpec(iv);
Run Code Online (Sandbox Code Playgroud)
2)要求密码生成IV
AlgorithmParameters params = cipher.getParameters();
params.getParameterSpec(IvParameterSpec.class);
Run Code Online (Sandbox Code Playgroud)
3)使用PBEParameterSpec
byte[] encryptionSalt = generateSalt();
PBEParameterSpec pbeParamSpec = new PBEParameterSpec(encryptionSalt, 1000);
Run Code Online (Sandbox Code Playgroud)
所有这些似乎对加密文本没有影响....帮助!
我的代码:
package com.citc.testencryption;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.PBEKeySpec;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
public class Main extends Activity {
public static final int SALT_LENGTH = 20;
public static final int PBE_ITERATION_COUNT = 1000;
private static final String RANDOM_ALGORITHM = …Run Code Online (Sandbox Code Playgroud) 好的,所以我理解哈希密码中盐的价值......有点儿.
我正在设置一个基本的身份验证方案,我设置密码,用户无法将密码设置为他们可能用于其他网站的东西.
那么盐的真正用途是什么?
在什么情况下,有人可能会破坏我的用户表,但也无法访问包含所有数据的其余表,或者我的PHP代码显示了魔力?
我试图确定在我的情况下使用盐是否真的那么重要.
谢谢
根据我在阅读和研究后的理解,使用盐的目的应该是每个存储密码的不同盐.
如果使用相同的salt来存储所有密码,我可以理解如何实现它,因为我可以将salt存储到一个常量私有变量并使用它.但是,事实并非如此.
虽然使用新的不同盐存储每个新密码是完全合理的,但我怎么想知道哪个用户的密码与哪个盐相关联?我想到的快速解决方案是将盐与用户的表属性一起存储,可能称为"盐",但是如果太容易从第一个地方找到盐就会失去从第一个地方获取盐的目的.数据库.
有人可以就此提出建议吗?
注意:我使用的是Python内置库(hashlib)或Bycrypt(Cryptacular或Passlib)
在密码安全性方面,有些人会同意存储密码哈希值,这可以对受损模型和数据进行统计防御.
有些人似乎不同意的是如何处理盐.你可以采用无数种技术来保护盐,但许多专家会建议它们只是对安全模型毫无意义的混淆,随着时间的推移,模型将暴露出来,我发现自己不同意有了这个,但我可能不理解另一个观点.
我不明白的是,如果你的模型受到损害,你为什么要采取完全妥协而不是部分妥协呢?如果您的安全模型分布在不同的安全基础架构中,那么部分折衷甚至可能不是问题.(如果您执行类似的操作,比如加密盐并从更不安全的环境中检索加密密钥,这种环境不太可能受到损害)
我假设妥协并不总是100%.我从未有过被黑客攻击的系统,也没有被黑客入侵,所以我没有完整的图片.
我是CS专业,我刚刚完成了ASP.net网站的设计,对于网站我需要一个登录认证系统......我不想使用SQLMembershipProvider,因为我真的想学习如何自己创建一个......无论如何,这就是我想出来的,我想知道是否有人可以给我一些反馈,提示或建议.
提前致谢
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Security.Cryptography;
/// <summary>
/// Summary description for PwEncrypt
/// </summary>
public class PwEncrypt
{
public const int DefaultSaltSize = 5;
private static string CreateSalt()
{
RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
byte[] buffer = new byte[DefaultSaltSize];
rng.GetBytes(buffer);
return Convert.ToBase64String(buffer);
}
public static string CreateHash(string password, out string salt)
{
salt = CreateSalt();
string saltAndPassword = String.Concat(password, salt);
string hashedPassword = FormsAuthentication.HashPasswordForStoringInConfigFile(saltAndPassword, "SHA1");
hashedPassword = string.Concat(hashedPassword, salt);
return hashedPassword; …Run Code Online (Sandbox Code Playgroud) 在sql中有关于密码的问题:
下面的代码通过随机生成10个字符的字符串来限制特定密码:
Update Teacher
SET TeacherSalt = SUBSTRING(MD5(RAND()), -10),
TeacherPassword = SHA1(CONCAT('009b9b624aaecc4b3217dcd4bfee15ab704745d7',SUBSTRING(MD5(RAND()), -10)))
WHERE TeacherPassword = '009b9b624aaecc4b3217dcd4bfee15ab704745d7'
Run Code Online (Sandbox Code Playgroud)
但我的问题是我想要更改盐,以便它生成的字符串来自所有这些字符:
./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789
有63个字符.php的方式如下:
$salt = "";
for ($i = 0; $i < 40; $i++) {
$salt .= substr(
"./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",
mt_rand(0, 63),
1);
}
Run Code Online (Sandbox Code Playgroud)
但是我怎么能用上面的sql方式写这个呢?
我想建立一个安全的网站.每次用户登录时都会更新密码盐吗?
编辑:我另外使用全局盐,它是硬编码的.
我在salt +密码上使用SHA-512哈希1000次.在查询有关用户的信息时是否可以安全返回,或者我应该保护它并使其仅通过HTTPS可用?
例如,如果我发出以下请求:
GET: http://domain.com/users?id=437
Run Code Online (Sandbox Code Playgroud)
它返回:
{"firstName":"Eliot","lastName":"My last name","email":"email@emailplace.com","password":[91,49,-34,77,79,-48,67,-62,-12,84,84,-18,-81,23,-92,-31,74,-28,-80,102,60,35,-102,115,18,-76,20,-90,-8,91,13,23],"authToken":"33c977b1-5ab6-4a8a-8da9-68c8028eff92","id":179}
Run Code Online (Sandbox Code Playgroud)
这是公开的吗?
在crackstation.net上使用php源代码进行散列+ salting,返回的散列包括使用的散列算法.我将从create_hash函数返回的哈希存储在我的数据库中.存储此信息是不好的做法吗?这会给黑客一个优势吗?
我一直在探索Twin-Bcrypt JavaScript库,并发现了一件奇怪的事情.有一次,我在服务器端使用PHP创建了自己的salt base64_encode(openssl_random_pseudo_bytes(16))并在TwinBcrypt.hash()函数中使用它,由于库中的常规模式不匹配,因此响应盐无效.所以,模式是:
var SALT_PATTERN = /^\$2[ay]\$(0[4-9]|[12][0-9]|3[01])\$[.\/A-Za-z0-9]{21}[.Oeu]/;
Run Code Online (Sandbox Code Playgroud)
我的盐看起来很好,除了一件事 - 这到底是什么 - [.Oeu]?
我的第一个问题是,为什么他们希望盐以点,或O,或e结束,或者你?据我所知openssl_random_pseudo_bytes()生成安全的CSPRNG,但由于模式JS库不想接受它.
第二个问题 - 盐是否有任何安全理由以/[.Oeu]/模式结束?
我会非常感谢任何帮助,因为没有太多关于它的信息.