我错过了什么吗?是否有任何其他步骤存储数据库的密码?
存储密码:
经过尽可能多的研究,我得出的结论是,在Web应用程序数据库(在我的例子中是MySQL + PHP)中存储用户密码的最佳方法如下:
攻击#1: 攻击者通过SQL注入转储数据库.
我们的hash_function的DB结果和每用户盐的随机数.
转储后,攻击者可以通过查找自己的帐户获取$ userPassword和 $ randomSalt.然后通过猜测md5等哈希函数,他可以在$ sitewideSalt上开始彩虹攻击 .但这可能需要1.41亿个世纪[1].
通过使用此类安全性,不允许转储数据库来破坏存储的密码.用户仍然必须通过另一种方法找到$ sitewideSalt.
攻击#2: 攻击者找到本地文件包含(LFI)向量.
攻击者可以获取我们的Web应用程序的原始代码.
在通过可能的LFI或RFI [2]利用Web应用程序之后,攻击者读取我们的Web应用程序的源代码并获得我们的简单算法和存储的
$ sitewideSalt.
下一步去哪儿?
现在,攻击者拥有他可以开始彩虹的两种盐来获取实际的密码.除非他必须为每个用户制作1个彩虹表,因为每个用户都有不同的随机用户特定盐($ randomSalt).
"现代服务器可以计算每秒大约330MB的MD5哈希值.如果您的用户拥有小写,字母数字和6个字符长的密码,您可以在大约40秒内尝试每个可能的密码."
"...... CUDA,你可以将自己的小型超级计算机集群放在一起,让你每秒可以尝试大约700,000,000个密码......"[3]
我们现在需要做的是使用耗时的算法扩展散列函数,例如bcrypt.bcrypt的工作负载因子可以是更简单的散列函数的5-6个数量级.破解一个密码可能需要数年而不是几分钟.并且作为奖励,bcrypt已经为每个哈希生成随机盐并将其存储在结果哈希中.
我正在尝试为我的密码正确地执行每个用户和站点范围的盐.这是我得到的:
require('../../salt.php'); //this is above the web root and provides $salt variable
$pw = mysql_real_escape_string($_POST['pw']);
$per_user_salt = uniqid(mt_rand());
$site_salt = $salt //from salt.php that was required on first line
$combine = $pw . $per_user_salt . $site_salt;
$pw_to_put_in_db = hash("sha512", $combine);
Run Code Online (Sandbox Code Playgroud)
这是正确的吗?谢谢
我正在开发一个PHP 5.4的网站,我想知道哪个更好用于生成密码安全的随机盐?
$salt = sha1(openssl_random_pseudo_bytes(23));
Run Code Online (Sandbox Code Playgroud)
要么
$seed = '';
$a = @fopen('/dev/urandom','rb');
$seed .= @fread($a,23);
$salt = sha1(seed);
Run Code Online (Sandbox Code Playgroud)
或者我应该选择:
$salt = openssl_random_pseudo_bytes(40);
Run Code Online (Sandbox Code Playgroud)
要么
$salt = '';
$a = @fopen('/dev/urandom','rb');
$salt .= @fread($a,23);
Run Code Online (Sandbox Code Playgroud) 与MYSQL sha1相关时什么是"盐"?我不知道与sha1密码加密有什么关系?有人可以解释一下它是什么吗?
在Linux系统中,使用MD5哈希存储密码.为什么"盐"的使用可以更多地保护系统?特别是,我想说明以下两点
/etc/shadow.例如,用户A具有用户salt s1并生成h1; h1 = md5(password.s1);.下一次,它使用salt s2,系统必须生成不同的哈希值h2 = md5(password.s2).由于h1不等于h2,系统如何验证用户?
好吧,所以我一直在阅读(很多!)关于安全性以及关于散列,腌制,加密等的整个交易以及我一直看到的东西真的让我烦恼.似乎很多人真的似乎知道他们的东西一直说可以在数据库中存储带有哈希密码的盐.
我不禁想知道,为什么?如果您的数据库被转储怎么办?他们可以访问所有内容,对我而言,这意味着他们可以查看任何一条记录,并且(!)有散列密码和旁边的纯文本盐.这给了他们在彩虹表和/或字典攻击下运行它所需的信息不是吗?
我必须遗漏一些东西(是的,那之前从未发生过!!)并且真的会对这件事情有所了解.
对于我的生活,我似乎无法在任何地方找到这个,如果有人甚至可以给我一个链接,我会非常感激.
我们正试图在openLDAP中启用SSHA哈希.默认情况下,它以明文形式存储密码,我认为这是犯罪行为,但是嘿,我是AD的家伙,所以我知道什么.但是如果您愿意的话,您会认为它们可以让您轻松找到打开哈希所需的信息.你不会选择吗?
我在申请认证时使用shiro.我使用散列密码和盐,我将它们存储在我的数据库中,如下所示:
private User createUserWithHashedPassword(String inName, String inFirstName, String inLastName, String inPassword){
ByteSource salt = randomNumberGenerator.nextBytes(32);
byte[] byteTabSalt = salt.getBytes();
String strSalt = byteArrayToHexString(byteTabSalt);
String hashedPasswordBase64 = new Sha256Hash(inPassword, salt, 1024).toBase64();
return new User(inName,inFirstName,inLastName,hashedPasswordBase64,strSalt);
}
Run Code Online (Sandbox Code Playgroud)
我在我的数据库中使用String存储salt.现在在我的领域我想从数据库中获取我的数据,我使用了一个transactionnal服务.但是我的salt是一个Strong,所以我希望它以静态方法转回ByteSource类型:
ByteSource byteSourceSalt = Util.bytes(salt); //where the salt is a String
Run Code Online (Sandbox Code Playgroud)
但是当我创建我的SaltedAuthenticationInfo时,它不会授权.
我认为我的问题来自我的转换方法:
private String byteArrayToHexString(byte[] bArray){
StringBuffer buffer = new StringBuffer();
for(byte b : bArray) {
buffer.append(Integer.toHexString(b));
buffer.append(" ");
}
return buffer.toString().toUpperCase();
}
Run Code Online (Sandbox Code Playgroud)
谢谢你的帮助.
实际上重新初始化密码并不是那么慢.由于迭代计数,创建密钥本身很慢.
此外,迭代计数被忽略,并且从未在加密本身中使用,仅用于密钥生成.根据所选择的算法,JCE api有点误导
由于Java中的加密技术非常...加密,我正在努力做一些优化.在功能方面,这个类非常有效,我希望它可以作为AES加密使用的一个例子
使用BouncyCastle的AES实现加密和解密数据时出现性能问题(我不比较,这是我测试过的唯一一个实现).实际上这个问题对于我决定使用的任何密码都是通用的.
主要问题是:我可以避免两个密码完全重新初始化每个加密/解密调用吗?它们太贵了
为简单起见,请记住以下代码已删除其异常处理,并进行了大量简化以保持对问题的关注.同步块用于保证线程安全
顺便说一下,欢迎对代码的任何部分进行反馈
谢谢
import java.nio.charset.Charset;
import java.security.SecureRandom;
import java.security.Security;
import java.util.Arrays;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.PBEParameterSpec;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
public class AES {
private static final int ITERATIONS = 120000;
private static final int SALT_SIZE_IN_BYTES = 8;
private static final String algorithm = "PBEWithSHA256And128BitAES-CBC-BC";
private static final byte[] KEY_SALT = "a fixed key salt".getBytes(Charset.forName("UTF-8"));
private Cipher encryptCipher;
private Cipher decryptCipher;
private SecretKey key;
private RandomGenerator randomGenerator = new …Run Code Online (Sandbox Code Playgroud) 给定一个名为package-list的文件,我想做类似的事情:
salt state.sls install-packages list_to_install=package-list
Run Code Online (Sandbox Code Playgroud)
......然后在sls中:
packages:
pkg.installed:
- names:
{% include list_to_install %}
Run Code Online (Sandbox Code Playgroud)