当PHP应用程序建立数据库连接时,它当然通常需要传递登录名和密码.如果我正在为我的应用程序使用单个最小权限登录,那么PHP需要知道某处的登录名和密码.保护密码的最佳方法是什么?看起来只是在PHP代码中编写它并不是一个好主意.
更新:我最近从这个问题中了解到,在下面的整个讨论中,我(我确信其他人也这样做)有点令人困惑:我一直称之为彩虹表,实际上称为哈希表.彩虹桌是更复杂的生物,实际上是Hellman Hash Chains的变种.虽然我认为答案仍然是相同的(因为它不归结为密码分析),但有些讨论可能有点偏差.
问题是:" 什么是彩虹表,它们是如何使用的? "
通常,我总是建议使用加密强随机值作为salt,与哈希函数(例如密码)一起使用,例如防止彩虹表攻击.
但实际上盐是随机的加密必需吗?在这方面,任何唯一值(每个用户唯一,例如userId)是否足够?实际上,它会阻止使用单个Rainbow Table来破解系统中的所有(或大多数)密码......
但是缺少熵真的会削弱散列函数的加密强度吗?
注意,我不是在问为什么要使用salt,如何保护它(它不需要),使用单个常量哈希(不要),或者使用什么样的哈希函数.
无论盐是否需要熵.
感谢所有答案到目前为止,但我想集中讨论我(有点)不太熟悉的领域.主要是对密码分析的影响 - 如果有人从密码数学PoV获得一些输入,我会非常感激.
此外,如果还有其他未被考虑的向量,那也是很好的输入(参见@Dave Sherohman指向多个系统).
除此之外,如果您有任何理论,想法或最佳实践 - 请使用证据,攻击情景或经验证据来支持这一点.或者甚至是可接受的权衡的有效考虑因素......我对该主题的最佳实践(资本B资本P)很熟悉,我想证明这实际上提供了什么价值.
编辑:这里有一些非常好的答案,但我认为正如@Dave所说,它归结为Rainbow Tables的常见用户名......以及可能不太常见的名称.但是,如果我的用户名是全局唯一的呢?不一定是我的系统唯一,但每个用户 - 例如电子邮件地址.
没有动力为单个用户构建RT(正如@Dave强调的那样,盐不会保密),这仍然会阻止群集.唯一的问题是我可能在不同的网站上有相同的电子邮件和密码 - 但盐无论如何都不会阻止它.
因此,它回归到密码分析 - 是否需要熵?(我目前的想法是从密码分析的角度来看没有必要,但这是出于其他实际原因.)
security authentication hash cryptography password-protection
通过JSON.NET序列化任意数据时,任何null属性都将写入JSON
"propertyName":null
当然,这是正确的.
但是我要求自动将所有空值转换为默认的空值,例如null strings应该变为String.Emptynull,int?s应该变为0null,bool?s应该是false,等等.
NullValueHandling没有帮助,因为我不想Ignore空,但我也不想要Include它们(嗯,新功能?).
所以我转向实施自定义JsonConverter.
虽然实现本身是轻而易举的,但不幸的是,这仍然CanConvert()无法工作 - 永远不会调用具有null值的属性,因此WriteJson()也不会调用它.显然空值会自动序列化null,而不需要自定义管道.
例如,以下是空字符串的自定义转换器示例:
public class StringConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return typeof(string).IsAssignableFrom(objectType);
}
...
public override void WriteJson(JsonWriter writer,
object value,
JsonSerializer serializer)
{
string strValue = value as string;
if (strValue == null)
{
writer.WriteValue(String.Empty);
}
else
{
writer.WriteValue(strValue);
}
}
} …Run Code Online (Sandbox Code Playgroud) 经过几次测试后,我开始得出这样的结论:浏览器在从https网页点击http页面时不会发送Referer HTTP标头.
这有什么安全理由?是在标准的某个地方定义的吗?
我正在尝试使用AesManaged进行简单的加密/解密,但在尝试关闭解密流时我一直遇到异常.这里的字符串被正确加密和解密,然后在Console.WriteLine输出正确的字符串后,我得到CryptographicException"Padding无效且无法删除".
有任何想法吗?
MemoryStream ms = new MemoryStream();
byte[] rawPlaintext = Encoding.Unicode.GetBytes("This is annoying!");
using (Aes aes = new AesManaged())
{
aes.Padding = PaddingMode.PKCS7;
aes.Key = new byte[128/8];
aes.IV = new byte[128/8];
using (CryptoStream cs = new CryptoStream(ms, aes.CreateEncryptor(),
CryptoStreamMode.Write))
{
cs.Write(rawPlaintext, 0, rawPlaintext.Length);
cs.FlushFinalBlock();
}
ms = new MemoryStream(ms.GetBuffer());
using (CryptoStream cs = new CryptoStream(ms, aes.CreateDecryptor(),
CryptoStreamMode.Read))
{
byte[] rawData = new byte[rawPlaintext.Length];
int len = cs.Read(rawData, 0, rawPlaintext.Length);
string s = Encoding.Unicode.GetString(rawData);
Console.WriteLine(s);
}
}
Run Code Online (Sandbox Code Playgroud) 跨站点请求伪造是否可以对抗无状态RESTful服务?
我不是在谈论伪REST,服务器会记住你是通过cookie登录的.我说的是没有cookie的纯无应用程序状态的服务器REST.
我正在使用SSL和基本身份验证.对于每个请求,该Authorization标头必须在那里.尽管在SSL级别存在某种会话,但JSP意义上没有"会话".
因此,我们假设我正在查看发出Ajax请求的合法网页,并且我会以某种方式转到同一选项卡或不同选项卡中的不同页面,并且该页面发出相同的Ajax请求.(我假设合法网页上没有恶意代码;这完全是另一回事,在这种情况下一切皆有可能.)
当第二个页面发出Ajax请求时,浏览器是否会放置相同的Authorization标头?也就是说,浏览器会说"哦,你想再去那里?嘿,我碰巧还有钥匙!"?
此外,恶意脚本无法执行xhr请求,然后在回调中从ioargs获取请求,获取Authorization标头并取消Base64的名称和密码?
我的意思是,有时建筑师希望以牺牲其他重要力量为代价来简化和提高可测试性.
例如,我正在审查一个非常复杂的应用程序,通过广泛使用过度支持测试的设计模式来实现,例如IoC,DI,AOP等......
现在,我通常喜欢这些东西,但这个系统应该是更简单 - 虽然不仅仅是数据库上CRUD的简单Web前端,但它仍然没有那么复杂(甚至考虑到一些内部工作流程,流程等).另一方面,只是审查代码成为heinie的主要痛苦,几乎不可读(即使它写得很好),编码一定是痛苦的.
实施的复杂性明显违反KISS(原则,而不是乐队)......"唯一"的好处是提高可测试性,使用测试框架和模拟和...
现在,在TDD粉丝跳过我之前,我并没有贬低可测试性的重要性,但我在质疑考虑这种特定力量(对所有其他力量)的至高无上的地位.
还是我错过了什么?
我想补充一点 - 在我看来,所有关于"可测试性"的讨论都是关于单元测试的,这与整个系统测试不同,并且当各个单元集成在一起时可能导致错过测试.至少,这似乎是用于测试的IoC/DI的重点......
另外,我指出这个系统(以及我见过的其他系统)每个接口只有一个具体对象,而IoC/DI仅用于 - 您猜对了 - 用测试模型替换具体对象仅用于测试.
虽然程序编程中的危险是以意大利面条代码结束,但使用控制反转时的危险以通心粉代码结束
是的,这完全表达了我的感受:D
WPF应用程序特有的攻击或安全漏洞是什么?
为了澄清,我不是问如何在WPF应用程序上进行SQL注入,或者我应该使用什么样的加密,或者......我也没有具体询问框架中的缺陷,或者WPF本身的缺陷,而是缺陷可能表现为基于不正确的实施.
非常具体地说,我对在WPF中实现的客户端应用程序特有的新攻击或新向量感兴趣.不是特别是XBAP ...... ClickOnce相关问题也很棒.
WPF Skin Skinning Security Concerns将是一个很好的例子,虽然与我的特定需求并不特别相关(但仍然是一个有效的答案).
有人熟悉当前版本的DotNetNuke中的特定安全问题吗?
(我已经检查过他们的网站,安全焦点等...)
我重新打开了这个问题,因为我的客户使用DotNetNuke开发了他们的系统 - 因此这是一个编程问题.我只需要了解有关此平台的一些问题.
security ×7
.net ×3
c# ×2
bots ×1
captcha ×1
cryptography ×1
csrf ×1
database ×1
dotnetnuke ×1
encryption ×1
hash ×1
http ×1
http-headers ×1
https ×1
json.net ×1
php ×1
rest ×1
tdd ×1
testing ×1
wpf ×1