Any site that provides the secret hash after you've input your client seed does not meet the commonly accepted definition of provably fair. Just to satisfy my curiosity, what sites do you have in mind that do this? Feel free to answer in a pm if you don't want to disparage other casinos.
Personally, I seriously doubt that a casino would be able to exploit vulnerabilities in a properly implemented provably fair solution. I think it's likely that the majority of people don't understand the system or how it works beyond maybe the basic knowledge that you should pick a complex seed derived from a high-entropy source, but I also think it doesn't matter so much. The minority of people who do understand and are checking will notice exploitation and either report it to the community or exploit it themselves if they're able. Either way, a cheating casino loses.
I think the bigger danger besides how the server seed is produced is a faulty implementation. Take a look at the following verification javascript from a particularly infamous bitcoin casino:
var provablyFair = function () {
return {
restrict: "E",
scope: {
serverSeed: "@",
clientSeed: "@",
initArray: "="
},
templateUrl: "tpl/directives/provably-fair.html",
link: function (a) {
var b = function (a) {
var b = new window.jsSHA(a, "TEXT");
return b.getHash("SHA-256", "HEX")
},
c = function (a, b) {
for (var c = a.length, d = parseInt("ffff", 16) + 1, e = 0, f = a.length - 1; c > 0;) {
var g = new window.jsSHA("" + c + b, "TEXT"),
h = g.getHash("SHA-256", "HEX").substring(0, 4),
i = parseInt(h, 16) / d,
j = Math.floor(i * (f - e + 1) + e);
c--;
var k = a[c];
a[c] = a[j], a[j] = k
}
return a
};
a.verify = function () {
a.clientSeed = "" + a.clientSeed, a.initialHash = b(a.serverSeed);
var d = c(a.initArray, a.serverSeed),
e = c(d, a.clientSeed);
a.finalArray = JSON.stringify(e)
}
}
}
};
This particular game gives you a server seed hash, and when you place your bet, you provide a client seed. After the bet, you are provided with the server seed. That seems to be following the rules so far. The problem here is that, like Bitzino, there is a third variable, the initial shuffle. The initial shuffle is only disclosed upon looking up your betting history. Obviously the server could change the initial shuffle in a favorable way in this system, and truly cheat the player in a completely undetectable way. This is solely a problem with a faulty implementation. I don't know that this casino is actually engaged in any kind of wrong doing, but the opportunity certainly exists. An interesting thing about this case is that the server secret is actually exposed before a second round of betting. This leads me to the conclusion that they are deliberately not exposing the initial shuffle, which seems fairly suspicious. They could actually expose the server secret before the initial bet and without that initial shuffle, it still would not be exploitable.
Edit: I reread the parent post, and I understand your point. You adequately countered nearly everything I've said. I don't believe you're correct in that a per bet server seed can't be made provably fair, however. This is again an issue of proper implementation. See Bitzino's solution:
e.setRandomClientSeed = function () {
var e, n, r = [];
try {
for (; r.length < 24;) e = new Uint8Array(8), crypto.getRandomValues(e), n = Math.floor(e[0] / 4), 62 > n && r.push(n)
} catch (i) {
for (var a = 0; 24 > a; a++) r.push(Math.floor(62 * Math.random()))
}
for (var o = [], a = 0; 24 > a; a++) n = r[a], n += 48, n > 57 && (n += 7), n > 90 && (n += 6), o.push(n);
t("#client_seed_input").val(String.fromCharCode.apply(null, o))
}
It uses a cryptographically secure function, picks a new seed for every bet, and doesn't communicate that seed to the server before the bet is placed. This could certainly be countered by overwriting this function with a predictable seed generator, but that's easily detected.
I'm not saying that a semi-permanent server seed is a better or worse than a per bet server seed. I think they both have strengths and weaknesses, but it is very possible to make both approaches work in a fair manner.