我肯定错过了什么。
我想为仅选择事务设置一个数据库用户帐户,但 mysql 不允许我在创建用户帐户时选择密码的哈希方法。
这失败了:
GRANT SELECT ON myDB.* TO 'selectuser'@'localhost'
IDENTIFIED BY hash('sha256', 'salted-myfakelongrandompasswordstring');
Run Code Online (Sandbox Code Playgroud)
ERROR 1064 (42000):您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,了解在第 1 行 'hash('sha256', 'salted-myfakelongrandompasswordstring')' 附近使用的正确语法
这通过了:
GRANT SELECT ON myDB.* TO 'selectuser'@'localhost'
IDENTIFIED BY 'salted-myfakelongrandompasswordstring';
Run Code Online (Sandbox Code Playgroud)
我检查了 phpinfo 页面,sha256 哈希引擎已经启用。
有没有办法更改 mysql 的默认哈希算法,或者我的 SQL 语法是否不正确?
我正在尝试使用“PBEWithHmacSHA256AndAES_256”标准制定正确的过程来加密和解密文件。
从我从 Oracle 的这个示例代码中了解到。
我收集到需要一个盐,以及一个迭代计数和哈希标准。
所以我有我的主要方法,传入加密方法:
new String(key).toCharArray()作为字节数组(使用此方法进行其他加密运行)initVector作为字节数组的安全随机 IVinputFile作为字符串outputFile作为字符串我已经按照代码示例编写了我认为对加密方法正确的内容。我通过将它们附加到密文来存储用于解密的盐和 IV。
private static void encrypt(byte[] key, byte[] initVector, String inputFile, String outputFile) //exceptions for throws... {
//Initalisation for encryption
Cipher cipher;
byte[] salt = new byte[16];
SecureRandom rand = new SecureRandom();
// Salt randomly generated with base64
rand.nextBytes(salt);
System.out.println("my salt should be" + Base64.getEncoder().encodeToString(salt));
salt = Base64.getEncoder().encode(salt);
// Iteration count
int count = 1000;
IvParameterSpec iv = new …Run Code Online (Sandbox Code Playgroud) 我看不出任何方法来加密MD5.ComputeHash(Stream).我错过了一些将字节注入HashAlgorithm的方法吗?
我在执行流计算之前尝试执行ComputeHash(byte []),但不出所料,它没有任何效果.任何想法(除了修改文件)?
谢谢你的时间.
附录 只是为了更具体一点,我想使用一个流来获取一个我不想加载到内存中的大文件的哈希值.
FileInfo myFI= new FileInfo("bigfile.dat");
FileStream myIFS = piFile.OpenRead();
MD5 md5 = MD5.Create();
byte[] hash = md5.ComputeHash ( myIFS );
myIFS.Close ();
Run Code Online (Sandbox Code Playgroud) 我决定使用存储在数据库中的每用户盐实现用户登录.盐的前缀为密码,密码用SHA进行哈希处理并存储在数据库中.
在过去我没有使用salt时,我会使用典型的方法来计算查询返回的行数,使用用户输入的用户名和密码.但是,对于每用户salt,您需要先获取salt,然后才能将其与存储的密码哈希进行比较.
因此,为了避免有两个查询(1获取盐和另一个验证输入凭据),我决定根据输入的用户名在单个查询中获取salt和散列密码.就像是
SELECT users.salt, users.password
FROM users
WHERE username = ?'
Run Code Online (Sandbox Code Playgroud)
然后在服务器端代码(PHP)中,我将salt与输入的密码连接起来,哈希并将其与已经从数据库中获取的密码进行比较.
如果不清楚,我想关键的区别在于,在后一种方法中,我在数据库中完成此操作之前检查PHP中的凭据.
在安全性或其他方面,这种方法是否有任何缺点
由于Rainbow表的引入,并且仅使用散列密码(例如:MD5)来存储数据库中的密码并不是最好的安全方式.
当人们谈论盐渍哈希时,总是以这种方式使用它hash(password . salt)甚至是hash(hash(password) . salt).
我不知道为什么要使用salt,并为每个密码添加额外的条目来存储盐?为什么我们不使用hash(hash(password)),甚至hash(hash(hash(password)))?
放盐更安全吗?还是只是感觉更复杂?
我试图使用Shiro JdbcRealm和SHA256 hashedcredentialsMatcher.我需要更新遗留数据库并为每个用户分配适当的盐(通过批处理例程).
如何使用Shiro框架获取/设置给定帐户的盐?
@using (Html.BeginForm("Create", "Posts", FormMethod.Post, new { id = "publish" }))
{
@Html.AntiForgeryToken("Posts/Create")
<input type="text" id="url" name="url" />
<input type="submit" value="@Html.Resource("Publish")" />
}
[HttpPost]
[ValidateAntiForgeryToken]
public JsonResult Create(string url)
{
// stuff that's never reached
}
Run Code Online (Sandbox Code Playgroud)
在验证CSRF令牌时,我无法意识到这个简单形式的失败.我该怎么调试呢?
更新
如果我取出盐,它的作用; 奇怪的是它曾经与盐一起使用,我无法弄清楚为什么它不再存在.
我的网络应用程序使用Spring Security插件进行身份验证和授权.我正在构建一种API,我需要验证用户密码.
Spring Security配置为使用带有5个loground和BC username属性的BCrypt 作为salt:
grails.plugins.springsecurity.password.algorithm = 'brcypt'
grails.plugins.springsecurity.password.bcrypt.logrounds = 5
grails.plugins.springsecurity.dao.reflectionSaltSourceProperty = 'username' // password salting
Run Code Online (Sandbox Code Playgroud)
现在,在我的控制器中,我想验证用户密码和登录.为此,我打电话springSecurityService.encodePassword(cmd.password, cmd.username)
cmd命令对象在哪里与我的参数.问题是,在每个请求中,编码的密码springSecurityService是不同的,并且与数据库中的用户密码不同.我也尝试在encodePassword调用中使用常量值,类似于:
springSecurityService.encodePassword('foo', 'bar')结果是相同的:在每个请求上编码的密码是不同的.这样我无法验证用户密码并从数据库获取有效的用户实例.
任何想法如何解决这个问题?
我已经问了十几次这个问题.
密码盐真的有必要吗?
我找不到关于这个主题的任何好文献.
从安全角度来看,密码盐有帮助吗?如果数据库被破坏,如果密码是反正的话,盐是不是会丢失?
此外,从刷力的角度来看,如果我禁止IP,是否真的有理由储存盐?